Неопределенный метод `class_detail 'для nil: NilClass

У меня есть две таблицы 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 %>

Может ли кто-нибудь помочь мне обновить независимую от пользователя таблицу! заранее спасибо

2 ошибки: 1) @user_class равен нулю, поэтому вы не можете вызывать какие-либо полезные методы для него. 2) даже если бы это было не nil, метод class_detail все равно нигде не определен.

Sergio Tulentsev 31.05.2018 11:43

Ваши ассоциации выглядят странно. Что представляет собой UserClass?

Stefan 31.05.2018 12:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
98
1

Ответы 1

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

В вашем коде будет та же ошибка, что и на исходном плакате. Смотри внимательно... :)

Marc Talbot 31.05.2018 12:54

UserClass принадлежит ClassDetail, а не ClassDetail к UserClass. Итак, @user_class не был установлен раньше, class_details должен существовать для user_class. Дочерний родитель обновления в исходном плакате.

Leo 31.05.2018 13:00

@Leo, я все еще получаю ту же ошибку. это не работает

Harini 04.06.2018 06:32

Хорошо, предоставьте свой журнал, имеющий отношение к ошибке. Кроме того, добавьте действия редактирования, потому что это не ошибка действия обновления. Но все же все, что вам нужно, это отладить свое состояние до того, как отобразится вид редактирования.

Leo 04.06.2018 08:59

Другие вопросы по теме