2013-07-12 49 views
3

我一直在试图找出这一天现在几天。我正在使用Rails 4(使用更新的批量分配技术)并尝试使用具有多对多关系的嵌套属性。我的记录保存在数据库中,但一切都是零,我在日志中收到“未经许可的参数:学校,校友,潜在客户”错误。Rails 4中的多对多嵌套属性(带有强参数)

这是我有:

referral.rb

class Referral < ActiveRecord::Base 
belongs_to :school 
belongs_to :alumni 
belongs_to :prospect 
end 

alumni.rb

class Alumni < ActiveRecord::Base 
    has_many :referrals 
    has_many :prospects, through: :referrals 

    accepts_nested_attributes_for :referrals 
end 

school.rb

class School < ActiveRecord::Base 
    has_many :referrals 
    has_many :prospects, through: :referrals 
    has_many :alumnis, through: :referrals 

    accepts_nested_attributes_for :referrals 
end 

prospect.rb

class Prospect < ActiveRecord::Base 
    has_many :referrals 
    has_many :alumnis, through: :referrals 

    accepts_nested_attributes_for :referrals 
end 

referrals_controller.rb

def create 
    @referral = Referral.create(referral_params) 

    respond_to do |format| 
    if @referral.save 
     # ReferralMailer.referrer_email(@referral).deliver 
     # ReferralMailer.referral_email(@referral).deliver 
     format.html { redirect_to @referral, notice: 'Referral was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @referral } 
    else 
     format.html { render action: 'new' } 
     format.json { render json: @referral.errors, status: :unprocessable_entity } 
    end 
    end 
end 

private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_referral 
    @referral = Referral.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def referral_params 
    params.require(:referral).permit(prospects_attributes: [:first_name, :last_name, :email], alumnis_attributes: [:first_name, :last_name, :email], schools_attributes: [:name]) 

    end 

_form.html.erb

<%= form_for(@referral) do |f| %> 
    <% if @referral.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@referral.errors.count, "error") %> prohibited this referral from being saved:</h2> 

     <ul> 
     <% @referral.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <%= f.fields_for :school do |builder| %> 
    <%= builder.label :name, "School Name" %> 
    <%= builder.text_field :name %> 
    <% end %> 

    <%= f.fields_for :alumnis do |builder| %> 
    <%= builder.label :first_name, "First Name" %> 
    <%= builder.text_field :first_name %> 

    <%= builder.label :last_name, "Last Name" %> 
    <%= builder.text_field :last_name %> 

    <%= builder.label :email, "Email" %> 
    <%= builder.text_field :email %> 
    <% end %> 

    <%= f.fields_for :prospects do |builder| %> 
    <%= builder.label :first_name, "First Name" %> 
    <%= builder.text_field :first_name %> 

    <%= builder.label :last_name, "Last Name" %> 
    <%= builder.text_field :last_name %> 

    <%= builder.label :email, "Email" %> 
    <%= builder.text_field :email %> 
    <% end %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

服务器日志输出

Processing by ReferralsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ee+rREUU/0wGzNFTEaMxr8oRStaA53X9fmDrlVRyrD8=", "referral"=>{"school"=>{"name"=>"asdf"}, "alumnis"=>{"first_name"=>"asdf", "last_name"=>"asfd", "email"=>"asdf"}, "prospects"=>{"first_name"=>"asdf", "last_name"=>"asdf", "email"=>"asdf"}}, "commit"=>"Create Referral"} 
Unpermitted parameters: school, alumnis, prospects 
    (0.1ms) begin transaction 
    SQL (0.5ms) INSERT INTO "referrals" ("created_at", "updated_at") VALUES (?, ?) [["created_at", Fri, 12 Jul 2013 03:49:06 UTC +00:00], ["updated_at", Fri, 12 Jul 2013 03:49:06 UTC +00:00]] 
    (0.6ms) commit transaction 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 
Redirected to http://localhost:3000/referrals/68 

转诊记录

=> #<Referral id: 68, created_at: "2013-07-12 03:49:06", updated_at: "2013-07-12 03:49:06", school_id: nil, alumni_id: nil, prospect_id: nil> 
+0

我不知道是否重要的​​是传入你的参数的键是字符串,但'referral_params'中的键是符号。但是,在阅读Jon Wheeler的建议之后,我认为这就是解决方法。 – RudyOnRails

+0

@cpeterson:我面临同样的问题 请你解释我,你是如何解决它的。 谢谢 –

回答

0

你也应该通过 '身份证' 在每个嵌套模式PARAMS试试:

def referral_params 
    params.require(:referral).permit(prospects_attributes: [:id,:first_name, :last_name, :email], alumnis_attributes: [:id,:first_name, :last_name, :email], schools_attributes: [:id,:name])  
end 

有摆动

干杯

+0

这看起来并不像它的工作。该ID是否需要设置?我认为一旦对象被保存,它就会被设置,但它仍然没有,同样的错误。 – cpeterson

+0

仍然不适用于我 它再次给出相同的错误。 –

0

您的参数不会因过强的参数而超过控制器。

从你的服务器日志:

"referral" => { 
    "school" => { 
    "name" => "asdf" }, 
    "alumnis" => { 
    "first_name" => "asdf", 
    "last_name" => "asfd", 
    "email"  => "asdf" 
    }, 
    "prospects" => { 
    "first_name" => "asdf", 
    "last_name" => "asdf", 
    "email"  => "asdf" 
    } 
} 

强参数期待prospects_attributesalumnis_attributesschools_attributes所以prospectsalumnisschool越来越堵塞,无任何属性都得到创建的对象。