似乎应该有一种超级快速的Railsy方法来做到这一点,但是过多的谷歌搜索并没有产生什么可以解决问题。
行。我需要从一个表单更新三个表。等式的视图部分有详细记录(form_for,fields_for)。但我不确定如何处理发送到父控制器中的更新操作的表单参数。注意:这三个表都有一个已定义的Rails关联。
查看:
<% form_for @account do |a| %>
<table>
<tr class="odd">
<td>
<%= a.label :plan_id %>
</td>
<td>
<%= a.text_field :plan_id %>
</td>
</tr>
<tr class="even">
<td>
<%= a.label :company %>
</td>
<td>
<%= a.text_field :company %>
</td>
</tr>
<% fields_for @user do |u| %>
<tr class="odd">
<td>
<%= u.label :first_name %>
</td>
<td>
<%= u.text_field :fname %>
</td>
</tr>
<tr class="even">
<td>
<%= u.label :last_name %>
</td>
<td>
<%= u.text_field :lname %>
</td>
</tr>
<tr class="odd">
<td>
<%= u.label :email %>
</td>
<td>
<%= u.text_field :email %>
</td>
</tr>
<tr class="even">
<td>
<%= u.label :phone %>
</td>
<td>
<%= u.text_field :phone %>
</td>
</tr>
<tr class="odd">
<td>
<%= u.label :title %>
</td>
<td>
<%= u.text_field :title %>
</td>
</tr>
<% end %>
<% fields_for @site do |s| %>
<tr class="even">
<td>
<%= s.label :domain %>
</td>
<td>
<%= s.text_field :domain_name %>
</td>
</tr>
<tr class="odd">
<td>
<%= s.label :url %>
</td>
<td>
<%= s.text_field :url %>
</td>
</tr>
<% end %>
<tr>
<td colspan="2">
<%= a.submit :submit %>
</td>
</tr>
</table>
<% end %>
更新帐户控制器的操作(这不起作用):
account = params[:account]
user = account
site = account
account.save!
user.save!
site.save!
如何处理发布到更新操作的参数?从一个表单在三个表中创建新记录似乎很简单,但我不知道如何从同一表单更新这三个表。
答案 0 :(得分:0)
如果帐户/用户/网站都相关,那么您模型中的关联将为您处理“表格”。您应该在模型方面考虑您的问题(即:您的域/业务问题)。假设一个用户可以拥有多个帐户(否则,帐户模型中没有任何一点),每个帐户都可以拥有一个网站(网络托管管理应用程序?)。
如果使用has_many等关系在app / models / * .rb中设置关联,则在控制器方法(或IRB)中保存表单非常简单。您拥有的控制器代码根本不对。你不能分配这样的变量,并期望Rails做那么多魔术。
account.user = params[:user]
account.site = params[:site]
对于嵌套表单。如果无法使用,请使用rails c
:
account = Account.new
user = User.new
site = Site.new
account.user = user
account.site = site
account.save # will fail if you have constraints/validations
让它在rails c和IRB中工作,然后使用Firebug或其他浏览器工具查看您的表单和HTTP活动。将它放在您的控制器方法puts params
中,您将看到嵌套表单的发布方式。