Unpermitted Parameter in spite of being included in strong params

微笑、不失礼 提交于 2019-12-11 18:35:55

问题


I have a situation where I am getting the error

Unpermitted parameter: incorporation

however I have it listed in the strong params:

def company_params
        params.require(:company).permit(:id, :name, :employee_stock_options, :options_pool, :state_corp, :street, :city, :state, :zip, :_destroy,
                            incorporation_attributes: [:title, :trademark_search, :user_id, :employee_stock_options, :final_submit, :submit, :_destroy],
                            names_attributes: [:id, :name_string, :suffix, :approved, :snapshot, :company_id, :_destroy],

There's a bit of a catch that might be contributing to the issue: The controller in question is actually the Incorporation controller. But, as you might notice, we are using it to create a parent model Company, which has_one :incorporation. I realize that this is a bit odd, but I have reasons for wanting my models to be structured this way AND for using the incorporations_controller for doing it.

Accordingly, I have my form structured in the following way:

<%= simple_form_for @company, url: url_for(action: @caction, controller: 'incorporations'), html: {id:"incorporationform"}, remote: false, update: { success: "response", failure: "error"} do |company| %>
  <%= company.simple_fields_for @incorporation do |f| %>
    <div class="padded-fields">
        <div class="form_subsection">
            <%= f.input :trademark_search, as: :radio_buttons, label: 'Would you like us to do a trademark search and provide advice regarding any issues we identify in relation to the name you have selected?', input_html: { class: 'form-control radio radio-false' } %>
        </div>
    </div>
  <% end %>
  ....
<% end %>

Thanks in advance for any insight

Update: My new and create methods are as follows in incorporations_controller

    def new
        @user=current_user
        @company = @user.companies.build
        @incorporation = @company.build_incorporation
        @action = "new"
        @caction = "create"
    end

    def create
        @snapshot="incorporation"
        @company = current_user.companies.build(company_params)
        @incorporation = @company.build_incorporation

        if @company.save
            current_user.companies << @company
            if params[:final_submit]
                redirect_to incorporations_index_path
            else
                redirect_to edit_incorporation_path(@incorporation), notice: "Successfuly saved incorporation info."
            end
        else
            render 'new', notice: "Something went wrong; form unable to be saved."
#       render :nothing => true
        end
    end

Update 2: In Case it helps, here are the parameters from the log:

"company"=>{"names_attributes"=>{"145\2853672570"=>{"name_string"=>"test19", "suffix"=>"INC", "_destroy"=>"false"}}, "fiscal_year_end_month"=>"", "fiscal_year_end_day"=>"", "street"=>"", "city"=>"", "state"=>"", "zip"\=>"", "issued_common_stock"=>"10,000,000", "employee_stock_options"=>"false", "options_pool"=>"0", "incorporation"=>{"submit"=>"0"}}, "commit"=>"Save"}  

I noticed that (unlike other nested attributes) incorporation does not have the _attributes line after it. Might that be of some significance?

Update3: I also seem to be creating an incorporation entry in the incorporations table with the proper ownership assigned. However no other fields are filled out.


回答1:


You shouldn't have incorporation in your submitted params anyway - it should be incorporation_attributes (as you've already got in your strong params).

--

If you're using fields_for, you should expect [association]_attributes to be passed as a parameter from your form.

Not having it means you've either not got accepts_nested_attributes_for in your parent model, or you have not built your child object:

#app/models/company.rb
class Company < ActiveRecord::Base
   has_one :incorporation
   accepts_nested_attributes_for :incorporation
end

--

#app/controllers/incorporations_controller.rb
class IncorporationsController < ApplicationController
   def new
       @company = Company.new
       @company.build_incorporation #-> only needed if a new record
   end

   def create
       @company = Company.new company_params
       @company.save
   end
end

Update

What a strange issue you have - you're passing names_attributes fine and yet incorporation doesn't work.

The one thing I would say, after looking at your params, is that your incorporation is only passing "submit" => "0". I don't see what that is; anyway there are numerous issues with your form:

def new
    @company = current_user.companies.new
    @company.build_incorporation
    ...
end

def create
    @company = current_user.companies.new company_params
    @company.save #-> don't need to "build" in create
end

This will allow you to...

<%= simple_form_for @company, url: url_for(action: @caction, controller: 'incorporations'), html: {id:"incorporationform"}, remote: false, update: { success: "response", failure: "error"} do |company| %>
  <%= company.simple_fields_for :incorporation do |f| %>
     <%= f.input ...
  <% end %>

When using fields_for, you only need to pass the parent object (in your case @company). Building incorporation will automatically populate fields_for without explicitly declaring it.




回答2:


The error indicates that we need to define this in company model:

accepts_nested_attributes_for :incorporation
attr_accessible :incorporation_attributes


来源:https://stackoverflow.com/questions/34807228/unpermitted-parameter-in-spite-of-being-included-in-strong-params

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!