Как я могу обновить два объекта User в одном Rails form_for? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь использовать form_for в рельсах для обновления двух объектов из модели User одновременно. Причина в том, что человек может обновлять базовую c информацию как для себя, так и для своего супруга (двух разных пользователей), не заполняя две отдельные формы.

Мой текущий код для обновления одного пользователя выглядит следующим образом :

<%= 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).

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

моя идея - использовать метод обновления вашего пользовательского контроллера

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
0 голосов
/ 07 февраля 2020

Это похоже на использование класса c для 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

Поскольку это обрабатывается на уровне модели, вы этого не делаете должен что-то делать в вашем контроллере, кроме внесения в белый список вложенных атрибутов.

...