неопределенный метод `class_detail 'для nil: NilClass - PullRequest
0 голосов
/ 31 мая 2018

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

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

1 Ответ

0 голосов
/ 31 мая 2018
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 уже связаны с пользователем,Создать модель ссылок - child-child-model - child-parent-model из одного вызова невозможно.Вы можете создать эти ссылки в действии редактирования.Например:

def edit
  @user.create_user_class!(class_detail: ClassDetail.find(n)) unless @user.user_class
end
...