Search code examples
ruby-on-rails-4associationsnested-attributesstrong-parameters

Rails 4: strong_params,nested_attributes_for and belongs_to association trouble


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.


Solution

  • 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.