Проблемы с Simple_form и acceptpts_nested_attributes_for - PullRequest
0 голосов
/ 27 февраля 2019

Я довольно новичок в RoR, поэтому извините, если я скажу что-то не так.

У меня есть эти модели.

class Course < ApplicationRecord
  has_many :frequencies, inverse_of: :course
  belongs_to :subject, optional: true
  validates :start_date, presence: true
end

class Frequency < ApplicationRecord
  belongs_to :user
  belongs_to :course
  validates :course, presence: true
  validates_presence_of :course
  accepts_nested_attributes_for :user, :course
  has_many_attached :docs
end

Соотношение между курсом и частотой составляет 1: N, нов конце я использую его как 1: 1 (все изменилось после определения моделей).

Это представление app / views / частоты / show.html.haml

    = simple_form_for @frequency, :url => frequencies_update_path(:id => @frequency.id) do |f|
            .panel.panel-primary
              .panel-heading
                %h4.panel-title= t 'frequencies.upd_frequency'
              .panel-body
                = f.simple_fields_for :user  do |u|
                  .row
                    .col-md-4
                      = u.label t 'frequencies.first_name'
                    .col-md-4
                      = u.input :first_name, :label => false, :disabled => true, :input_html => {:id => 'first_name'}
                  .row
                    .col-md-4
                      = u.label t 'frequencies.last_name'
                    .col-md-4
                      = u.input :last_name, :label => false, :disabled => true, :input_html => {:id => 'last_name'}
                      -#= u.hidden_field :id, value: @user_id
            .panel.panel-primary
              .panel-heading
                %h4.panel-title= t 'frequencies.course'
              .panel-body
                = f.simple_fields_for :course  do |u|
                  .row
                    .col-md-4
                      = u.label t 'frequencies.course_start_date'
                    .col-md-4
                      = u.input :start_date, :label => false, :disabled => (@frequency.validated? ? true : false), :input_html => {:id => 'course_start_date'}
    .
    .
    .
    = f.submit t('button.save'), :class => 'btn btn-primary ' + (current_user.role == $admin_role && @frequency.validated? ? 'disabled' : '')
= link_to t('button.cancel'), request.referer.present? ? request.referer : frequencies_index_path, :class => 'btn btn-default'

Это часть частоты_контроллера.рб

def update
    @frequency = Frequency.find params[:id]
    @course = Course.find @frequency.course_id
    if over_max_hours_in_a_day(frequency_params[:user_attributes][:id], @course)
        flash[:danger] = t('flash.max_hours')
        render :action => :show and return
    end
    if @course.update(frequency_params[:course_attributes])
      @frequency.docs.attach(frequency_params[:attach][:docs]) if (frequency_params[:attach].present? && frequency_params[:attach][:docs].present?)
      flash[:notice] = t('flash.upd')
      redirect_to :action => 'index' and return
    else
      flash[:danger] = @course.errors.full_messages.to_sentence
      render :action => :show and return
    end
  end


  def show
    @frequency = Frequency.find params[:id]
    @subjects = Subject.all
  end

Я могу редактировать курс с точки зрения соответствующей частоты, но у меня странное поведение:

  • , когда я сохраняю процесс проверки, но у меня появляется сообщение об ошибке только в виде флеш-сообщения, а не в соответствующем поле (в других более простых представлениях сообщение также отображается в поле)
  • когда я редактирую некоторые поля курса (из представления частоты) и после того, как я нажимаю на кнопку сохранения, он вызывает действие обновления, но если он выполняется внутри условия over_max_hours_in_a_day if, я не могу оставаться в том же видес измененными полями предварительноскомпилировано (но у меня есть такие поля, как оно загружается в начале действия show)
  • , когда я нажимаю кнопку отмены после предыдущего неудачного редактирования, я остаюсь на той же странице, а не возвращаюсь к предыдущему виду (просмотр в виде индекса))

Я не уверен, происходит ли это из-за accepts_nested_attributes_for для модели own_to, потому что я обычно вижу это в модели has_many.

Rails 5 5.2.2

simple_form 4.1.0

Пожалуйста, вы можете мне помочь?

Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019
  1. отдельная логика в зависимости от представления (из страниц шоу / индекса).Создайте 2 метода обновления
  2. в случае ошибки, просто визуализируйте представление снова render :show OR render :index
  3. Я думаю, что лучше перенести логику over_max_hours_in_a_day на модель
  4. для кнопки отмены не используйтереферер, потому что после обновления он не будет работать.Передайте точный обратный URL, используя локальные формы или другим способом
  5. , если вы хотите выделить поля - вы должны вызвать для него метод .update, .save с параметрами формы
...