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

时间:2019-01-04 15:47:51

标签: ruby-on-rails ruby ruby-on-rails-3 conditional

我正在处理一个多步骤表单,该表单基于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

当前,控制器无法使用@order.payment = 'wiretransfer'@order.payment = 'credit card'来应用最后两个elsif条件。

所有其他条件都正常,但是当我通过信用卡部分结帐时,将执行电汇部分。

当我使用时:

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

“信用卡”有效,但“电汇”无效。因为我在表单的最后一步显示了付款属性,所以我知道它在那一步仍然存在,尽管还没有保存到数据库中。

我在做什么错?我发现有时候我不得不使用=,而另一些时候则使用==,但是我不清楚其合理性。

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

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

触发正确的div。

在控制器中有两个条件

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

仅适用于==,而其他所有仅适用于=。我从仅在控制器中使用==开始,但是当我这样做时,什么也没有执行,并且呈现了新内容。

提前谢谢!

1 个答案:

答案 0 :(得分:4)

在两种情况下,您都应使用==

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

=为变量分配一个值,而==检查两个值/变量是否相等。

由于=返回一个分配的值,在这两种情况下它都不是nil,因此它被视为是事实-这就是为什么拥有以下条件的原因:

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

从不调用下一个elsif

值得一读: