2013-07-12 201 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越來越堵塞,無任何屬性都得到創建的對象。