Rails - Редактирование нескольких моделей из отдельного контроллера и формы - PullRequest
0 голосов
/ 25 сентября 2018

Это расширение этого первоначального вопроса: Rails - Редактирование моделей пользователя и профиля из отдельного контроллера настроек

Моя форма отлично подходит для редактирования одной модели (профиля), однако япопытался расширить это, чтобы позволить пользователю редактировать некоторые поля из модели User.В настоящее время вся форма больше не сохраняет никаких данных, но я не вижу никаких видимых сообщений об ошибках в браузере, кроме сообщения об успешном завершении в моем методе обновления, который не запускается.

Как успешно расширитьэта настройка, позволяющая сохранять поля пользователя и профиля в одной форме?В настоящее время форма редактирует профиль, а затем разрешает поля для пользователя - это неправильно?

У меня есть 2 модели: пользователь:

class User < ApplicationRecord

  has_one :profile, dependent: :destroy

  before_create :create_profile

  private
  def create_profile
    build_profile(name: username)
  end

end

и профиль:

class Profile < ApplicationRecord

belongs_to :user
accepts_nested_attributes_for :user

end

Обе модели доступны для редактирования через контроллер настроек:

class SettingsController < ApplicationController

  def profile
    @profile = User.find_by_id(current_user).profile
  end

  def update
    set_profile
    respond_to do |format|
      if @profile.update(profile_params)
        format.html { redirect_back fallback_location: settings_path, notice: 'Profile was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  private
    def profile_params
      params.require(:profile).permit(:name, user_attributes: [:email])
    end
end

В настройках / профиле профиль пользователя редактируется в следующей форме:

<h1>Settings</h1>
<div>

  <div>
    Name: <%= @profile.name %>
  </div>

  <%= form_with(model: @profile, url: update_settings_profile_path, local: true) do |form| %>

    <div class="field">
      <%= form.label :name %> 
      <%= form.text_field :name %>
    </div>

    <%= form.fields_for :user do |user_form| %>

      <div class="field">
        <%= user_form.label :email %> 
        <%= user_form.text_field :email %>
      </div>

    <% end %>

    <div class="actions">
      <%= form.submit %>
    </div>
  <% end %>

</div>

Здесь приведенысписок маршрутов, показывающих страницу профиля, и метод обновления для всех остальных методов:

get 'settings', to: redirect('settings/profile')
get 'settings/profile', to: 'settings#profile', as: :settings_profile
patch 'settings', to: 'settings#update', as: :update_settings

Параметры при отправке формы: (Удален токен авторизации для ясности.)

Parameters: {"utf8"=>"✓", "authenticity_token"=>"X", "profile"=>{"name"=>"John Doe", "user_attributes"=>{"email"=>"test@email.com", "id"=>"22"}}, "commit"=>"Update Profile"}

Схема: (Основные столбцы удалены для ясности.)

create_table "profiles", force: :cascade do |t|
  t.string "name"
  t.bigint "user_id"
  ...
  t.index ["user_id"], name: "index_profiles_on_user_id"
end

create_table "users", force: :cascade do |t|
  t.string "email", default: "", null: false
  t.string "username", default: "", null: false
  ...
end

Цените любые советы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...