感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Rails4で「ActionController::InvalidAuthenticityToken」というエラーが出た

スポンサーリンク

Rails3では出なかったのに、Rails4で同じようなコードを書いたら

ActionController::InvalidAuthenticityToken in SamplesController#index

というエラーが出て、Viewが表示されなかった。

Viewのコードでは、普通のHTMLのformタグを書いていたんだけど、これが原因かもしれない。
ググったら、RailsがCSRF対策で、勝手にエラーを吐くとかいう話が書いてあった。

<form method="post" action="/samples/index">
<table>
  <tr>
    <th>名前</th>
    <td><input type="text" name="name"></td>
  </tr>
  <tr>
    <th>年齢</th>
    <td><input type="text" name="age"></td>
  </tr>
  <tr>
    <th>趣味</th>
    <td><input type="text" name="interest"></td>
  </tr>
  <tr>
  	<th></th>
  	<td><input type="submit"></td>
  </tr>
</table></form>

<hr />

このHTMLのformタグで送信している部分を、以下のようにform_tagメソッドを使って書き換えてみると、エラーは出ずに、送信したデータをモデルにつっこむことができるようになった。

<%= form_tag( { controller: :friends, action: :index},
id: :name, class: :name) do %>
名前:
<%= text_field_tag :name, '', size: 30 %>
<br/>
年齢:
<%= text_field_tag :age, '', size: 30 %>
<br/>
興味:
<%= text_field_tag :interest, '', size: 30 %>
<br/>
<%= submit_tag '送信' %>
<br/>
<% end %>
<hr />

<table>
<tr>
  <th>ID</th>
  <th>名前</th>
  <th>年齢</th>
  <th>趣味</th>
</tr>
<% @friends.each do |friend| %>
  <tr>
    <td><%= friend.id %></td>
    <td><%= friend.name %></td>
    <td><%= friend.interest %></td>
  </tr>
<% end %>
</table>

コントローラはこんな感じ。

class FriendsController < ApplicationController
  def index

    if request.post? then
      obj = Friend.new(
        :name => params['name'],
        :age => params['age'].to_i,
        :interest => params['interest']
      )
      obj.save
    end

    @friends = Friend.all
  end
end

画面はこんな感じで表示される。
f:id:sho322:20140419192244j:plain
聞いている作業用ミュージックはDAISHI DANCEだ。最高。

rake dbconsoleで見ても、テーブルにうまいことデータが突っ込まれていて、「ActionController::InvalidAuthenticityToken」というエラーは出なかった。


the ジブリ set 2

the ジブリ set 2

DAISHI DANCEのジブリset、めっちゃいいよ!
今更かもしれないけれど。