2013-07-25 11 views
25

が、私は単純なレール4を使用して作成やろうレール4 ActiveModel :: ForbiddenAttributesError

私のコントローラ:

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 私は間違って何をしていますか?

UPDATE:

私の問題は、アクションを作成して新しいメソッドに誤った値を渡した:解決策がそれに

答えて

39

ad_paramsを渡すことだった私が更新するために、スキップを示唆しているので、あなたのコードは

の作品

あなたの問題はおそらくあなたのコントローラーではありませんが、あなたのモデルは あなたの属性はアクセス可能なタグを参照してください。

あなたはから物事をアクセスしている時はいつでもattr_accessible /強のparamsを使用する必要が How is attr_accessible used in Rails 4?

レール4が、これは以前、私が理解から、それはちょっと違うんので、いくつかの良いリンクを提供答えるん

attr_accessible :title, :price, :description 
データベース。

更新

ああ、若いこと、および4が強いのparamsを使用するレールを実現しないように。私はOPが既に彼の元の問題を解決していると理解していますが、これを正解として実際に使用できるように修正するつもりです。

これはコントローラのレベルの問題です。これは、Rails 4ではコントローラの属性をホワイトリストに登録する必要があるためです。

Ad.create(params[:ad].require(:ad).permit(:title, :price, :description)) 

時間のほとんどを作成および更新アクションで同じのparamsを許可することがありますので、コントローラ内の独自のメソッドに移動するのがベストです。

Ad.create(ad_params) 
def ad_params 
    params.require(:ad).permit(:title, :price, :description) 
end 

OPは彼のコメントで指摘したように、彼は実装permitted_pa​​rams方法は、許可証から呼び出されていませんでした。

+0

私の問題は、アクションを作成して新しいメソッドに誤った値を渡した、解決策はこれはおそらく答えとしてマークされるべきではない、それ – Maki

+9

にad_paramsを渡すことでした。 – ghempton

+0

これは答えではありません。 – snowYetis

31

私も同じ問題に直面し、6時間働いて、最後に解決策を得ました。

このコードを試してみてください! Rails 4では、さまざまな方法で作成を処理するためにこの機能が追加されました。

def new 
    @ad = Ad.new 
end 

def create 
    @ad = Ad.create(ad_params) 
    @ad.save 
end 

private 

def ad_params 
    params.require(:ad).permit(:title, :price, :description) 
end 
+0

タイトル、価格、説明はテーブル広告の列名です –

1

あなたの次のようになります。新しい

def create 
    @about = About.new(params[:about].permit(:introduction, :description)) 

    respond_to do |format| 
     if @about.save 
      format.html { redirect_to @about, notice: 'About was successfully created.' } 
      format.json { render action: 'show', status: :created, location: @about } 
     else 
      format.html { render action: 'new' } 
      format.json { render json: @about.errors, status: :unprocessable_entity } 
     end 
    end 
end 
6

広告の前にparams.permitを追加します。

def new 
    @ad = Ad.new(params[:ad].permit(:title, :price, :description)) 
end 

鉱山は、このようになります!

def create 
    params.permit! 
    @ad = Ad.new(params[:ad])  
    @ad.save 
    end 
+0

これを使用する際は特に注意してください。 Railsのドキュメントから、「現在のモデル属性と将来のすべてのモデル属性を大量に割り当てることができるように、permitを使用するときは細心の注意を払う必要があります。 –

関連する問題