我的 rails3 应用程序中有一个简单的嵌套表单。我正在尝试弄清楚如何在保存时将父模型中的值保存到子模型中。
class Radcheck < ActiveRecord::Base
set_table_name 'radcheck'
attr_accessible :attribute_name, :username, :value, :op
belongs_to :raduser
end
class Raduser < ActiveRecord::Base
has_many :radcheck, :dependent => :destroy
accepts_nested_attributes_for :radcheck
end
还有我的表格:
<%= form_for @raduser do |f| %>
<p>
<%= f.label :username %><br />
<%= f.text_field :username %>
</p>
<%= f.fields_for :radcheck do |builder| %>
<li>
<%= builder.label :attribute_name %><%= builder.text_field :attribute_name %>
</li>
<% end %>
<p><%= f.submit "Submit" %></p>
<% end %>
我想要做的是在保存时将 Raduser.username 值保存到 radcheck 表中。对于每条记录。
我试过在 Controller 中放置一些东西,但这对我们来说并没有真正起作用。
-- 更新--
在我的 radcheck Controller 中,我已经尝试过这个(作为测试)但是值没有保存。
def create
@radcheck = Radcheck.new(params[:radcheck])
@radcheck.username = '123'
respond_to do |format|
if @radcheck.save
format.html { redirect_to @radcheck, notice: 'Radcheck was successfully created.' }
format.json { render json: @radcheck, status: :created, radcheck: @radcheck }
else
format.html { render action: "new" }
format.json { render json: @radcheck.errors, status: :unprocessable_entity }
end
end
end
也在 radusers 中尝试过,但出现错误。
最佳答案
看起来您发布的 Controller 代码是针对 Radcheck Controller 的,对吗?如果是这样,您也发布的表单将使用 RaduserController
类的 create
操作,而不是来自 RadcheckController
的操作。这可以解释为什么您在 radcheck 行中看不到用户名“123”。
如果用户名字段在父项和子项之间是相同的,那么同步这两者的常用方法是使用观察者或 before_save
回调。我将在下面概述 before_save
方法:
class Radcheck < ActiveRecord::Base
set_table_name 'radcheck'
attr_accessible :attribute_name, :username, :value, :op
belongs_to :raduser
before_save :sync_usernames
private
def sync_usernames
self.username = self.raduser.username
end
end
我已经用 Rails 3.1 测试过它,它可以工作;但是,我知道我在以前版本的 Rails 中访问子模型中的父模型时遇到了问题。在那些情况下,我必须将 before_save
操作放在父模型上,并让它遍历每个子模型,以这种方式设置适当的属性。
关于ruby-on-rails - Rails3 嵌套属性在保存操作中使用父值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8211205/