【问题标题】:How can I update two User objects in the same Rails form_for?如何更新同一个 Rails form_for 中的两个用户对象?
【发布时间】:2020-02-06 16:01:21
【问题描述】:

我正在尝试使用 rails 中的 form_for 同时更新来自 User 模型的两个对象。原因是一个人可以更新自己和配偶(两个不同的用户)的基本信息,而无需填写两个单独的表格。

我当前用于更新一个用户的代码如下所示:

<%= form_for(@user, :url=> wizard_path, :method => :put) do |f| %>
    <div class="form-group form-question-group">
        <%= f.label :state, "What state do you live in?", class: "form-question" %>
        <%= f.select(:state, options_for_select(us_states, selected: @user.state), {:prompt => "State"}, :class => "form-control", :required => true) %>
        <%= f.hidden_field :user_id, value: @user.id %>
    </div>

    <div class="form-buttons">
        <%= link_to "Back", previous_wizard_path, :class => "align-left" %>
        <%= f.submit "Continue", :class => "btn btn-primary align-right" %>
    </div>
<% end %>

如何编辑此表单,以便在提交时不仅更新当前用户,还更新用户的配偶(可以通过@user.spouse 访问)。

【问题讨论】:

标签: ruby-on-rails forms form-for


【解决方案1】:

我的想法是使用你的用户控制器更新方法

def update
  if @user.update_attributes(user_params)
    # here you update spouse
    spouse = @user.spouse
    if spouse.present?
      spouse.state = @user.state
      spouse.save
    end
    flash[:success] = 'success'
  end
end

【讨论】:

  • 投票,但有一件事是,我会将两个更新包装到 ActiveRecord::Base.transaction 中。
【解决方案2】:

这听起来像是 ActiveRecord::NestedAttributes 的经典用例。

嵌套属性允许您在关联记录上保存属性 通过父母。默认情况下,嵌套属性更新是关闭的 您可以使用accepts_nested_attributes_for 类启用它 方法。当您启用嵌套属性时,属性编写器是 在模型上定义。

class User
  belongs_to :spouse
  accepts_nested_attributes_for :spouse
end

<%= form_for(@user, :url=> wizard_path, :method => :put) do |f| %>
  # ...
  <%= f.fields_for :spouse do |sf| %>
     <%= sf.label :name, 'Your spouses name' %>
     <%= sf.text_field :name %>
  <% end %
<% end %>

def user_params
  params.require(:user)
        .permit(:foo, :bar, :baz, spouse_attributes: [:id, :name, :email]) # ...
end

由于这是在模型层处理的,因此除了将嵌套属性列入白名单之外,您无需在控制器中执行任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多