RailsでFormを表示してみる

RailsをMySQLに対応させてみるの続き
RailsのMySQLの環境にアクセスできるようにしておくも済ませておく)

RailsでFormを表示してみる。


とりあえずUserのモデルとテーブルを作っておく。

$ rails generate model user name:string gender:integer category:integer flag:boolean comment:text
$ rake db:migrate
ちなみに「type」というカラム名を使うとエラーになる。

【参考】
Trouble | CreativeStyle
http://kadoppe.com/archives/tag/trouble

Formを表示してみる

下記のようなコントローラを作成。

$ vi app/controllers/sample_controller.rb
class SampleController < ApplicationController
  def index
    @user = User.new
  end
  def update
    render :json => params[:user]
  end
end

updateメソッドにPOSTできるようにする。

$ vi config/routes.rb
post 'sample/update' => 'sample#update'	←追加

ViewにFormを書く。

$ mkdir app/views/sample
$ vi app/views/sample/index.html.erb
<%= form_for(@user, :url => {:controller => 'sample', :action => 'update'}) do |f| %>
  <%= f.text_field :name %><br />
  <%= f.radio_button :gender, 1 %><%= f.radio_button :gender, 2 %><br />
  <%= f.select :category, {'カテゴリ1' => 1 , 'カテゴリ2' => 2, 'カテゴリ3' => 3} %><br />
  <%= f.check_box :flag %>フラグ<br />
  <%= f.text_area :comment %><br />
  <%= f.submit "決定" %><br />
<% end %>
 デフォルトだと「/users」にPOSTしようとするので
 :urlに:controllerと:actionを指定している。

ブラウザでアクセスすると、下記が表示される。

下記のように入力し、[決定]を押すと、

下記のようにブラウザに表示される。

{"name":"あああ","gender":"2","category":"3","flag":"1","comment":"いいい\r\nううう"}

Formの内容をFormに再表示させる

updateの内容を下記のように修正し、受け取ったパラメタでuserオブジェクトを作成する。

$ vi app/controllers/sample_controller.rb
class SampleController < ApplicationController
  def index
    @user = User.new
  end
  def update
    user_params = params.require(:user).permit(:name, :gender, :category, :flag, :comment)
    @user = User.new(user_params)
    render :action => :index
  end
end
Rails4では下記のような書き方はNGらしい
@user = User.new(params[:user])

【参考】
ActiveModel::ForbiddenAttributesError(StrongParameter)エラー - 頑固二徹
http://nitetsu4.blog.fc2.com/blog-entry-5.html

下記のように入力し、[決定]を押すと、同じ内容の画面が表示される。

form_tag

form_tagなどの・・・_tag系のメソッドで下記のように書くこともできる

$ vi app/views/sample/index.html.erb
<%= form_tag('/sample/update') do %>
  <%= text_field_tag 'user[name]', @user.name %><br />
  <%= radio_button_tag 'user[gender]', 1, (@user.gender == 1) %><%= radio_button_tag 'user[gender]', 2, (@user.gender == 2) %><br />
  <%= select_tag 'user[category]', options_for_select([['カテゴリ1', 1], ['カテゴリ2', 2], ['カテゴリ3', 3]], @user.category)  %><br />
  <%= check_box_tag 'user[flag]', true, @user.flag %>フラグ<br />
  <%= text_area_tag 'user[comment]', @user.comment %><br />
  <%= submit_tag '決定' %><br />
<% end %>

参考

フォーム(form) - Railsドキュメント
http://railsdoc.com/form