Rails:控制器操作中的 elsif && 条件语句不起作用

Rails: elsif && conditional statement in controller action not working

我正在制作一个多步骤表单,该表单基于 Ryan Bates 的 #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'
  ...

'Credit card' 有效,但 'wiretransfer' 无效。因为我在表单的最后一步显示了付款属性,所以我知道它在该步骤仍然存在,尽管它还没有保存到数据库中。

我做错了什么?我发现有时我必须使用 = 有时我必须使用 ==,但我不清楚其中的合理性。

在视图中我必须使用 ==(比较),例如:

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

触发正确的 div。

控制器中的两个条件

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

仅适用于 ==,而所有其他仅适用于 =。我开始时只在控制器中使用 ==,但是当我这样做时,什么都不会执行,并且会呈现新的。

提前致谢!

你应该在这两种情况下使用 ==:

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

= 为变量赋值,而 == 检查两个 values/variables 是否相等。

作为 = returns 一个赋值,在这两种情况下它不是零,它被评估为真实 - 这就是为什么当你有:

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

下一个 elsif 永远不会被调用。

值得一读: