Rails嵌套属性ID保存但不是项目

时间:2014-05-12 19:57:00

标签: ruby-on-rails

所以在我建造的这个小铁道应用程序中,我有一个嵌套形式的自由职业者和交易。问题是,当我尝试创建一个新的自由职业者并保存它时,它会保存除商品名称之外的所有内容。

这就是我的控制器的样子:

class FreelancersController < ApplicationController
  def index
   @freelancers = Freelancer.all
  end

  def show 
    @freelancer = Freelancer.find(params[:id])
  end

  def new
   @freelancer = Freelancer.new
   @trade = Trade.new
  end

  def create
    @freelancer = Freelancer.new
    @freelancer.firstname = params[:freelancer][:firstname]
    @trade = Trade.new
    @trade.name = params[:trade_attributes]
    @trade.save
    @freelancer.trade = @trade
    @freelancer.save
    redirect_to freelancer_path(@freelancer)
  end

  private

  def freelancer_params
    params.require(:freelancer).permit(:firstname, trade_attributes: [:id, :name])
  end
end

这是我的表格:

<%= form_for(@freelancer) do |f| %>
  <p><%= f.label :firstname %></br>
  <%= f.text_field :firstname %></p>

  <%= f.fields_for :trade do |trade| %>
    <p><%= trade.label :type %>
    <%= trade.text_field :name %></p>
  <% end %>

  <%= f.submit "New Freelancer" %>
<% end %>

自由职业者模特:

class Freelancer < ActiveRecord::Base
  belongs_to :trade
  accepts_nested_attributes_for :trade
end

贸易模式:

class Trade < ActiveRecord::Base
  has_many :freelancers
end

对于Freelancer,它保存id,firstname和trade_id。对于交易,它只保存id。名称未设置。我想@ freelancer.trade = @trade会起作用,因为它在控制台中没有错误并且实际上保存了所有内容。所以我不知道如何让它在应用程序本身中保存名称。

1 个答案:

答案 0 :(得分:0)

你正在尝试的是群发作业,但是你没有让Rails自由地为你做这件事。在create行动中,你应该这样做:

def create
  freelancer = Freelancer.create(freelancer_params)
  redirect_to freelancer_path(freelancer)
end

这应该是你所需要的一切。

仅供参考:在您的代码中,您设置的是@trade.name = params[:trade_attributes],但params[:trade_attributes]最有可能返回nil。我非常确定:trade_attributes是嵌套在params[:freelancer]内的密钥。

有关Rails中的质量分配的更多信息:http://code.tutsplus.com/tutorials/mass-assignment-rails-and-you--net-31695(请注意,attr_protectedattr_accessible上的讨论与您无关,因为您在Rails上使用强参数4。文章最后有Rails 4的更新。)