Rails 4を使って簡単な作成をやってみます
私のコントローラー:
class AdsController < ApplicationController
def new
@ad = Ad.new
end
def create
@ad = Ad.new(params[:ad])
@ad.save
end
def show
@ad = Ad.find(params[:id])
end
def index
@ads = Ad.first(3)
end
private
def ad_params
params.require(:ad).permit(:title, :price, :description)
end
end
形状:
<%= form_for @ad do |p| %>
<p><%= p.text_field :title %></p>
<p><%= p.text_field :price %></p>
<p><%= p.text_area :description %></p>
<p><%= p.submit %></p>
<% end %>
私の観点からは問題ありませんが、このエラーが発生しましたActiveModel::ForbiddenAttributesError
。何が間違っているのでしょうか?
アップデート:
私の問題は、作成アクションで新しいメソッドに間違った値を渡していたことです。解決策は、ad_params
それに渡すことでした
ベストアンサー1
コードが機能するように更新をスキップすることをお勧めします
問題はおそらくコントローラではなくモデルにあります。次のタグで属性にアクセスできるかどうかを確認してください。
attr_accessible :title, :price, :description
Rails 4 では、私が理解しているものとは少し異なる動作をします。この以前の SO の回答には、いくつかの優れたリンクが提供されています。Rails 4 では attr_accessible はどのように使用されますか?
データベースから何かにアクセスするときは常に、attr_accessible/Strong Params を使用する必要があります。
アップデート
ああ、若かったので、Rails 4 が Strong Params を使用していることに気付かなかった。OP が元の問題をすでに解決していることは理解していますが、実際に正しい回答として使用できるようにこれを修正します。
Rails 4 ではコントローラー内の属性をホワイトリストに登録する必要があるため、これはコントローラー レベルの問題になります。
Ad.create(params[:ad].require(:ad).permit(:title, :price, :description))
ほとんどの場合、作成アクションと更新アクションで同じパラメータを許可することになるため、コントローラ内の独自のメソッドに移動するのが最善です。
Ad.create(ad_params)
def ad_params
params.require(:ad).permit(:title, :price, :description)
end
OP がコメントで指摘したように、彼が実装した permitted_params メソッドは、許可から呼び出されていませんでした。