web-dev-qa-db-ja.com

has_many:throughアソシエーションでRails 4つの強いパラメーターを使用するには?

Has_manyを取得するのに問題があります:Rails 4の強力なパラメータを使用した関連付けを通して。私はCheckoutと呼ばれるモデルがあり、Employeeモデルチェックアウトと従業員は、Employmentモデルを介して関連付けられます。

新しいチェックアウトを作成しようとすると、このエラーが発生します。

NoMethodError in CheckoutsController#create
undefined method `employee' for #<Checkout:0x007ff4f8d07f88>

作成アクション、チェックアウトパラメータ、または新しいチェックアウトフォームのいずれかに問題があるようです。作成アクションは次のとおりです。

  def create    
    @user = current_user
    @checkout = @user.checkouts.build(checkout_params)

    respond_to do |format|
      if @checkout.save
        format.html { redirect_to @checkout, notice: 'Checkout was successfully created.' }
      else
        format.html { render action: 'new' }
      end
    end
  end

私のチェックアウトパラメーター:

def checkout_params
      params.require(:checkout).permit(:job, :employee_ids, :shift, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end

私の新しいチェックアウトフォーム:

<div class="field">
     <%= f.label :employee %><br>
     <%= f.collection_select(:employee_ids, Employee.all.collect, :id, :full_name, {:Prompt => "Please select"} ) %>
</div>

しかし、Rails 4と強力なパラメータで何が変わったのかわかりません。Rails 3このタイプの関連付けとフォームは、代わりにattr_accessibleを使用して機能しました。 strong_parametersの。

関連ファイル

エラーの完全なトレース: https://Gist.github.com/leemcalilly/0cb9e2b539f9e1925a3d

models/checkout.rb: https://Gist.github.com/leemcalilly/012d6eae6b207beb147a

controllers/checkouts_controller.rb: https://Gist.github.com/leemcalilly/a47466504b7783b3177

views/checkouts/_form.html.erb https://Gist.github.com/leemcalilly/ce0b4049b23e3d431f55

models/employee.rb: https://Gist.github.com/leemcalilly/46150bee3e6216fa29d1

controllers/employees_controller.rb: https://Gist.github.com/leemcalilly/04f3acdac0c9a678bca8

models /雇用.rb: https://Gist.github.com/leemcalilly/6adad966dd48cb9d1b39

db/schema.rb: https://Gist.github.com/leemcalilly/36be318c677bad75b211

34
Lee McAlilly

強力なパラメータ(従業員、employee_idsなど)に付ける名前は、送信する名前youに依存するため、ほとんど関係がないことに注意してください。強力なパラメーターは、命名規則に基づいた「魔法」では機能しません。

理由 https://Gist.github.com/leemcalilly/a71981da605187d46d96 が「employee_ids」で「許可されていないパラメーター」エラーをスローしているのは、配列を予期しているためです、スカラー値ではなく、 https://github.com/Rails/strong_parameters#nested-parameters ごとのスカラー値。

# If instead of:
... "employee_ids" => "1" ...
# You had:
... "employee_ids" => ["1"]

その後、強力なパラメーターが機能します。具体的には:

... { :employee_ids => [] } ...

これは、単なるスカラー値ではなく、スカラー値の配列を受け取っているためです。

53
Denzel

わかりましたので、実際にパラメーターをネストする必要はありませんでした。これが私のために働いたものです:

# Never trust parameters from the scary internet, only allow the white list through.
def checkout_params
  params.require(:checkout).permit(:job, :shift, :employee_ids, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end

以下は、機能した変更の組み合わせです。

それでも、これがなぜ機能したのかはまだよくわかっていません。

4
Lee McAlilly

私は自分のコントローラーの1つで使用する許可ステートメントを投稿できます。これには、多対多の関連もあります。許可配列をネストします。許可ステートメントでルックアップ関連付けを使用します。唯一の違いは、3度目にネストされないことです。

私の場合、関連付けQuote has_many :quote_items

QuoteItems has_many :quote_options, :through => quote_item_quote_options

Quotes_controller.rbに

params.require(:quote).permit(:quote_date, :good_through, :quote_number, quote_items_attributes: [:id,:quote_id, :item_name, :material_id, quote_item_quote_options_attributes:[:quote_option_id,:quote_item_id,:qty,:_destroy,:id]])
0
ctilley79