2016-09-27 11 views
0

私はformを持っています。これは、パラメータをコントローラに渡して、ActiveModel::ForbiddenAttributesErrorの原因となります。私のcreate関数は、これらの配列パラメータを修正し、その部分を文字列に結合する別の関数を呼び出すが、その時点では遅すぎると思う。Rails 4:ハッシュを使用したパラメータ

のparams

{ "remote"=> 
     { "name"=>"", 
     "start_date"=>"9/27/2016", 
     "email"=>"", 
     "allergies"=>["Peanuts", "Soy Protein", "Dairy", ""], 
     } 
} 

コントローラ

def create 

    new_params = fix_params(params, ["allergies"]) 
    remote_params = new_params["remote"] 
    @remote = Remote.new(remote_params) 

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

def fix_params(params, fields) 
     fields.each do |field| 
      to_change = params[:remote][field] 
      new_param = to_change.join(", ").strip() 
      params[:remote][field] = new_param || "" 
     end 
    return params 
end 

たぶん、これらの変数を渡すために良い方法はありますか?

+1

を含めるために、私の強いパラメータを変更しました。あなたもそれを投稿できますか?また、なぜfix_paramsメソッドが必要なのですか?達成しようとしていたのは何ですか?間違いなく、より荒々しい道があります。 – Matt

+0

あなたは正しいです、それはモデルによるもので、私は 'fix_params'でやることとは違ったやり方をしたいと思っています。この関数は基本的にパラメータの配列をとり、それらを文字列に結合します –

+0

あなたのモデルでそれを行うためのより良い方法があります。カスタムアトリビュートを定義するdef allergies =(value)do self [:allergies] = value.is_a?(Array )? value.join( '、').strip:value end。モデルは設定するたびに値を修正します。 – arieljuod

答えて

0

arrayがparamsに渡されることは明示されていないので、エラーは、unpermitted parametersがあるという事実のために発生していました。

私は `ActiveModel`エラーがモデルで何かがこれをブロックしていることをお勧めparams.require(:remote).permit(:name, :start_date, :email, :allergies => [])

関連する問題