Rails: условный оператор elsif && в действии контроллера не работает - PullRequest
0 голосов
/ 04 января 2019

Я работаю над многоэтапной формой, основанной на учебнике # 217 Multistep Forms Райана Бейтса . Мне нужно было реализовать условную навигацию внутри формы, и все стало довольно сложно.

Навигация внутри формы работает, но у меня проблемы с условиями в моем контроллере относительно фиксации.

def create
  @order.current_step = session[:order_step]
  if @order.valid?
    if params[:back_button]
      @order.previous_step
    elsif params[:back_button_wiretransfer]
      @order.payment_options_step
    elsif params[:back_button_credit_card]
      @order.creditcard_options_step
    elsif @order.thirdlast_step? && params[:commit] == 'Wiretransfer'
      @order.payment = nil
      @order.payment = 'Wiretransfer'
      @order.confirmation_step
    elsif @order.thirdlast_step? && params[:commit] == 'Credit card'
      @order.next_step
    elsif @order.secondlast_step?
      @order.payment = nil
      @order.payment = 'Credit card'
      @order.next_step
    elsif @order.last_step? && @order.payment = 'Wiretransfer'
      ...
    elsif @order.last_step? && @order.payment = 'Credit card'
      ...
    else
      @order.next_step
    end
    session[:order_step] = @order.current_step
  end
  if @order.new_record?
    render "new"
  else
    ...
  end
end

В настоящее время контроллер не может применить два последних условия elsif с @order.payment = 'wiretransfer' или @order.payment = 'credit card'.

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

Когда я использую:

elsif @order.last_step? && @order.payment == 'Wiretransfer'
  ...
elsif @order.last_step? && @order.payment = 'Credit card'
  ...

«Кредитная карта» работает, а «безналичный» - нет. Поскольку я показываю атрибут платежа на последнем шаге формы, я знаю, что он сохраняется на этом шаге, хотя он еще не был сохранен в базе данных.

Что я делаю не так? Я обнаружил, что иногда мне приходится использовать =, а иногда ==, но рациональное мне не понятно.

В представлении я должен использовать == (сравнение), например:

<% elsif @order.last_step? && @order.payment == "Credit card" %>

, чтобы вызвать правильные деления.

В контроллере два условия

elsif @order.thirdlast_step? && params[:commit] == 'Wiretransfer' 
elsif @order.thirdlast_step? && params[:commit] == 'Credit card'

работает только с ==, а все остальные только с =. Я начал с использования только == в контроллере, но когда я это делал, ничего не выполнялось, а новое отображалось.

Заранее спасибо!

1 Ответ

0 голосов
/ 04 января 2019

Вы должны использовать == в обоих случаях:

elsif @order.last_step? && @order.payment == 'Wiretransfer'
  ...
elsif @order.last_step? && @order.payment == 'Credit card'
  ...

= присваивает значение переменной, тогда как == проверяет, равны ли два значения / переменные.

Поскольку = возвращает присвоенное значение, которое не равно нулю, в этих двух случаях оно оценивается как истина - вот почему, когда у вас есть:

elsif @order.last_step? && @order.payment = 'Wiretransfer'

следующий elsif никогда не вызывается.

Стоит прочитать:

...