Это расширение этого первоначального вопроса: 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
Цените любые советы!