【问题标题】:Many-to-Many Nested Attributes in Rails 4 (with strong parameters)Rails 4 中的多对多嵌套属性(具有强参数)
【发布时间】:2013-07-12 03:57:01
【问题描述】:

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

这是我所拥有的:

referral.rb

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

校友.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>

【问题讨论】:

  • 我想知道传递给参数的键是字符串是否重要,但 referral_params 中的键是符号。然而,在阅读了 Jon Wheeler 的建议后,我认为这就是解决办法。
  • @cpeterson :我面临同样的问题,你能解释一下,你是如何解决的。谢谢

标签: many-to-many nested-attributes ruby-on-rails-4


【解决方案1】:

您还应该在每个嵌套模型参数中传递“id”尝试:

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

摇摆

干杯

【讨论】:

  • 这看起来不起作用。是否需要以某种方式设置 ID?我认为一旦保存对象就设置了它,但它仍然是 nil 并出现相同的错误。
【解决方案2】:

您的参数没有像预期的强参数那样传递给控制器​​。

来自您的服务器日志:

"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 被阻止,并且正在创建的对象没有任何属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多