Объявление переменной экземпляра в представлении и передача в модель - PullRequest
1 голос
/ 14 января 2010

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

Модель выглядит так:

  validates_presence_of :first_name, :last_name, :if => :registration_step?
  validates_numericality_of :primary_phone, :if => :contact_step?

  def registration_step?
    @step == :register
  end
  def contact_step?
    @step == :contact
  end

Я не уверен, что я должен разместить в своем представлении, чтобы все функционировало правильно. Я пробовал

<% @step = :register %> и

<% @step = :contact %>

Как и некоторые другие комбинации (: step, а также @step с «register» и «contact». Я знаю, что это просто вопрос синтаксиса, или я просто упускаю еще одну вещь в модели, но могу не разбирайся.

1 Ответ

1 голос
/ 14 января 2010

Переменные экземпляра, установленные в представлении, не попадут в модель, по крайней мере, напрямую.Проблема, которую вы описываете - условная часть - это то, с чем мы просто пытались справиться сегодня.

Я думаю, вам лучше всего иметь attr_accessor на вашей модели, которую вы можете установить при создании контроллера.обновить, что бы ни делали - это то, что не должно быть установлено в представлении.Оказавшись в вашей модели, вы можете иметь метод, который проверяет значение этого атрибута в ваших if условиях для проверки.Определенно, не передавайте это как скрытое поле из вашей формы.Вы не хотите доверять таким вещам, которыми пользователь может манипулировать.

Ответ на комментарий:

Если вы добавите step в качестве attr_accessor в свой контроллер,вы должны быть в состоянии сделать что-то вроде

@my_model = MyModel.new(params[:model])
@my_model.step = :register
if @my_model.save...

И, в вашей модели, что-то вроде

validates_presence_of :first_name, :last_name, :if => :registration_step?
def registration_step?
  step == :register
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...