我在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表中。对于每条记录。
我已尝试在控制器中放置一些内容,但这并不适合我们。
- 更新 -
在我的radcheck控制器中,我已尝试过(作为测试),但价值不会保存。
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,但这给了错误。
答案 0 :(得分:3)
您发布的控制器代码看起来像Radcheck控制器,对吗?如果是这样,您发布的表单将使用create
类的RaduserController
操作,而不是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
操作放在父模型上,并让它迭代每个子项,以这种方式设置适当的属性。