所以在我建造的这个小铁道应用程序中,我有一个嵌套形式的自由职业者和交易。问题是,当我尝试创建一个新的自由职业者并保存它时,它会保存除商品名称之外的所有内容。
这就是我的控制器的样子:
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会起作用,因为它在控制台中没有错误并且实际上保存了所有内容。所以我不知道如何让它在应用程序本身中保存名称。
答案 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_protected
和attr_accessible
上的讨论与您无关,因为您在Rails上使用强参数4。文章最后有Rails 4的更新。)