У меня есть две таблицы class_details и user_classes. Таблица user_classes зависит от user table и class_details, а class_details не зависит от таблицы пользователя. Теперь мое требование состоит в том, что, когда я нажимаю кнопку, в базе данных должны сохраняться некоторые детали, которые принадлежат разным таблицам. Таблица, зависящая от пользователя, сохраняется только в базе данных, а не в независимых от пользователя таблицах, и я получаю сообщение об ошибке undefined method class_detail for nil:NilClass.
Код контроллера
def update_profile
if @user.update(user_params)
redirect_to profile_index_path, notice: 'Profile was successfully updated.'
else
render :index
end
end
end
private
def set_user
@user = User.find(current_user.id)
@user.fee || @user.build_fee
@user.user_class || @user.build_user_class
end
def user_params
params.require(:user).permit(:name, fee_attributes: %i[id fee_hour fee_month], user_class_attributes: %i[id class_detail [id class_name class_category]])
end
class_detail.rb
class ClassDetail < ApplicationRecord
has_one :user_class, dependent: :destroy
end
user_class.rb
class UserClass < ApplicationRecord
belongs_to :user
belongs_to :class_details
validates_presence_of :user_id
end
user.rb
has_one :fee, dependent: :destroy
accepts_nested_attributes_for :fee
has_one :user_class, dependent: :destroy
просмотреть код
<%= form_for(@user, url: {action: 'update_profile'}, html: {class: 'm-form m-form--fit m-form--label-align-right'}) do |f| %>
<%= f.fields_for :fee, @user.fee do |u| %>
<%= u.number_field :fee_hour, class: 'form-control m-input', placeholder: t('.fee_for_hour') %>
<% end %>
<%= f.fields_for :user_class, @user.user_class do |k| %>
<%= f.fields_for :class_detail, @user_class.class_detail do |c| %>
<%= c.text_field :class_name, class: 'form-control m-input' %>
<% end %>
<% end %>
Может ли кто-нибудь помочь мне обновить независимую от пользователя таблицу! заранее спасибо
Ваши ассоциации выглядят странно. Что представляет собой UserClass?





params.require(:user).permit(:name, fee_attributes: %i[id fee_hour fee_month], user_class_attributes: %i[id class_detail [id class_name class_category]])
Это означает, что вы хотите обновить class_detail из user_class, но вам нужно определить вложенные атрибуты:
class UserClass < ApplicationRecord
belongs_to :user
belongs_to :class_details
accepts_nested_attributes_for :class_details, update_only: true
validates_presence_of :user_id
end
Также форма должна выглядеть так:
<%= form_for(@user, url: {action: 'update_profile'}, html: {class: 'm-form m-form--fit m-form--label-align-right'}) do |f| %>
<%= f.fields_for :fee, @user.fee do |u| %>
<%= u.number_field :fee_hour, class: 'form-control m-input', placeholder: t('.fee_for_hour') %>
<% end %>
<%= f.fields_for :user_class, @user.user_class do |k| %>
<%= k.fields_for :class_detail, @user.user_class.class_detail do |c| %>
<%= c.text_field :class_name, class: 'form-control m-input' %>
<% end %>
<% end %>
<% end %>
И в вашем контроллере:
def user_params
params.require(:user).permit(:name, fee_attributes: %i[id fee_hour fee_month], user_class_attributes: [:id, { class_detail: %i[class_name class_category] }])
end
Отредактировано:
Все это означает, что class_details и user_class уже связаны с пользователем. Построить ссылочную модель - дочернюю-дочернюю-модель - дочернюю-родительскую-модель из одного вызова невозможно. Вы можете создать эти ссылки в действии редактирования. Например:
def edit
@user.create_user_class!(class_detail: ClassDetail.find(n)) unless @user.user_class
end
В вашем коде будет та же ошибка, что и на исходном плакате. Смотри внимательно... :)
UserClass принадлежит ClassDetail, а не ClassDetail к UserClass. Итак, @user_class не был установлен раньше, class_details должен существовать для user_class. Дочерний родитель обновления в исходном плакате.
@Leo, я все еще получаю ту же ошибку. это не работает
Хорошо, предоставьте свой журнал, имеющий отношение к ошибке. Кроме того, добавьте действия редактирования, потому что это не ошибка действия обновления. Но все же все, что вам нужно, это отладить свое состояние до того, как отобразится вид редактирования.
2 ошибки: 1)
@user_classравен нулю, поэтому вы не можете вызывать какие-либо полезные методы для него. 2) даже если бы это было не nil, методclass_detailвсе равно нигде не определен.