在Rails 2.3.x中以一种形式更新多个表

时间:2012-03-12 19:20:41

标签: ruby-on-rails html-table

似乎应该有一种超级快速的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!

如何处理发布到更新操作的参数?从一个表单在三个表中创建新记录似乎很简单,但我不知道如何从同一表单更新这三个表。

1 个答案:

答案 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中,您将看到嵌套表单的发布方式。