0

I really can't get my head around Rails 4 strong parameters, belongs_to association and form with fields_for.

Imagine I have model for quoting some price:

class Quote < ActiveRecord::Base
  belongs_to :fee
  accepts_nested_attributes_for :fee

Now, I have seeded some fees into the db, and have put some radiobuttons on my form_for @quote using fields_for. The values of the radiobuttons are simply ids of the records.

Here is the troubling part, the controller:

def create
  @quote = Quote.new(quote_params)
  ...

end

def quote_params
  params.require(:quote).permit(:amount_from, fee_attributes: [:id])
end

From my understanding, automagically Rails should fetch fee record with some id, but there is some mystic error instead.

params hash is: "quote"=>{"amount_from"=>"1200", "fee_attributes"=>{"id"=>"1"}}

Log tail:

Completed 404 Not Found in 264ms

ActiveRecord::RecordNotFound (Couldn't find Fee with ID=1 for Quote with ID=)
  app/controllers/quotes_controller.rb:14:in `create'

I really don't understand what is going on here, have read Rails association guide, googled for hour for all info, but to no avail.

What I want to achieve here is to understand the correct "Rails way" to fetch some associations for new Quote object using some params I've put in the form.

Dr.Strangelove
  • 1,505
  • 1
  • 11
  • 12

1 Answers1

0

Guess I got nested_attributes_for wrong, somehow thought it would call Fee.find automagically. I've opted for ditching fields_for helpers from the form and rendering fields manually like

radio_button_tag 'fee[id]', fee.id

Then in controller I have 2 params methods now:

  def quote_params
    params.require(:quote).permit(:amount_from)
  end

  def fee_params
    params.require(:fee).permit(:id)
  end

And my action looks like

 def create
    @quote = Quote.new(quote_params)
    @quote.fee = Fee.find(fee_params[:id])
    ...

Any additions on best practices when one has to handle lots of different objects with not so straight init logic are welcome.

Dr.Strangelove
  • 1,505
  • 1
  • 11
  • 12