Рельсы: 2 модели, 1 стол.Отдельные формы + контроллеры.После активной ошибки проверки записи форма отображает неверную модель / неверно - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть 2 модели (pass и subscription), 2 контроллера и 2 формы.Модели совместно используют таблицу базы данных.

Общая таблица passes.Чтобы сообщить, является ли запись subscription, существует столбец is_subscription.Таким образом, у меня есть следующее для моей subscription модели:

      self.table_name = :passes
      default_scope { where(is_subscription: true) }
      validates :name, presence: true

Обратите внимание на проверку name.

Форма subscription:

<%= form_for(@subscription, html: {class: "my-class"}) do |f| %>

, который отображает:

<form class="form-horizontal" id="new_subscription" action="/subscriptions" accept-charset="UTF-8" method="post">
<input class="form-control" type="text" name="subscription[name]" id="subscription_name">
...

В контроллере:

  def show
  end

  def new
    @subscription = Subscription.new
  end

  def create
    @subscription = current_user.company.passes.new(subscription_params)
    if @subscription.save
      redirect_to subscription_path(@subscription), notice: "Yay"
    else
      render :new
    end
  end

Все отлично работает.Но если я попытаюсь создать новую подписку и пропущу name из формы - это вызовет проверку активной записи и ошибку.Форма перерисовывается и теперь изменилась:

<form class="form-horizontal" id="new_pass" action="/passes" accept-charset="UTF-8" method="post">
<input class="form-control" type="text" value="" name="pass[name]" id="pass_name">
...

Я попытался установить as: "subscription", который исправляет все, кроме действия.Если я установлю action:, действие все равно будет отменено.

Буду признателен за понимание того, как лучше всего справиться с этим.К сожалению, у меня нет возможности изменить положение таблицы (т.е. использовать отдельные таблицы).

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я не знаю, почему вы создаете Pass, когда вы отправляете подписку (вы говорите, что у вас есть 2 контроллера, но похоже, что вы используете только один контроллер для обоих (?)).

Я быпросто установите объект подписки, если Pass не может быть сохранен:

def create
  @subscription = Pass.new(subscription_params)
  if @subscription.save
    redirect_to subscription_path(@subscription), notice: "Yay"
  else
    @subscription = Subscription.new(subscription_params)
    render :new
  end
end

Таким образом, у вас будет подписка на переменную, которую вы используете.

EDIT: также, проверьте activerecord'sподдержка Single Table Inheritance, она может помочь вам очистить модель https://edgeguides.rubyonrails.org/association_basics.html#single-table-inheritance

0 голосов
/ 17 февраля 2019

Вы можете использовать form_tag вместо form_for.Первый не заботится об используемом объекте модели - фактически вы даже не передаете его. Это потребует от вас использования общих text_field_tag и т. Д. Помощников вместо form.text_field :foo, которые вы могли бы использовать сейчас.

Но это позволит вам обойти эту проблему.

...