Ruby on rails Rails:elsif&&;控制器操作中的条件语句不工作

Ruby on rails Rails:elsif&&;控制器操作中的条件语句不工作,ruby-on-rails,ruby,ruby-on-rails-3,conditional,Ruby On Rails,Ruby,Ruby On Rails 3,Conditional,我正在编写一个基于Ryan Bates教程的多步骤表单。我需要在表单中实现条件导航,事情变得相当复杂 表单内的导航正在工作,但我的控制器中与提交相关的条件存在问题 def create @order.current_step = session[:order_step] if @order.valid? if params[:back_button] @order.previous_step elsif params[:back_button_wiretran

我正在编写一个基于Ryan Bates教程的多步骤表单。我需要在表单中实现条件导航,事情变得相当复杂

表单内的导航正在工作,但我的控制器中与提交相关的条件存在问题

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='wiredtransfer'
@order.payment='credit card'
应用最后两个elsif条件

所有其他条件都有效,但当我通过信用卡部分结账时,就会执行电汇部分

当我使用:

elsif @order.last_step? && @order.payment == 'Wiretransfer'
  ...
elsif @order.last_step? && @order.payment = 'Credit card'
  ...
“信用卡”行得通,但“电汇”不行。由于我在表单的最后一个步骤中显示了payment属性,我知道它在该步骤中仍然存在,尽管它尚未保存到数据库中

我做错了什么?我发现有时我不得不使用
=
,有时我不得不使用
=
,但我不清楚其合理性

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

<% elsif @order.last_step? && @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 = 'Wiretransfer'
从不调用下一个
elsif

值得一读:


在这两种情况下都应使用
=

elsif @order.last_step? && @order.payment == 'Wiretransfer'
  ...
elsif @order.last_step? && @order.payment == 'Credit card'
  ...
=
为变量赋值,而
=
检查两个值/变量是否相等

=
返回一个赋值时,在这两种情况下该值不是零,它被评估为真值-这就是为什么当您有:

elsif @order.last_step? && @order.payment = 'Wiretransfer'
从不调用下一个
elsif

值得一读:



看到像
thirdlast\u step?
这样的方法有点令人担忧。也许有更好的方法来表达这一点,比如将它转向
案例
,以突破步骤号和
:commit
参数;0). 我还没有进行重构,只是添加了两个步骤来看看条件导航是否可行。值得注意的是,本教程看起来确实太复杂了,而且有点过时(Rails 3.2?),所以请接受它的建议。查看这段代码,我不确定这是否是最好的方法。您最好保存一个设置了某种“挂起”或“不完整”标志的记录,并在每个请求之间将其向前踢,必要时添加数据。最后一步将该标志翻转,使其“真实”。这种方法似乎是滚雪球方法,在视图中累积参数,每次都来回踢。这通常比拥有一个包含(潜在的)不完整记录的表要混乱得多,你需要将其保留在范围之外,并且在实现之前不可见。谢谢你的建议,我会珍惜你的建议。我更改了查询按钮的条件,现在它可以工作了。因为这是最后一块,所以我想让所有东西都先运行起来。现在我将开始抛光+重构,更彻底地研究您的建议。再次感谢!看到像
thirdlast\u step?
这样的方法有点令人担忧。也许有更好的方法来表达这一点,比如将它转向
案例
,以突破步骤号和
:commit
参数;0). 我还没有进行重构,只是添加了两个步骤来看看条件导航是否可行。值得注意的是,本教程看起来确实太复杂了,而且有点过时(Rails 3.2?),所以请接受它的建议。查看这段代码,我不确定这是否是最好的方法。您最好保存一个设置了某种“挂起”或“不完整”标志的记录,并在每个请求之间将其向前踢,必要时添加数据。最后一步将该标志翻转,使其“真实”。这种方法似乎是滚雪球方法,在视图中累积参数,每次都来回踢。这通常比拥有一个包含(潜在的)不完整记录的表要混乱得多,你需要将其保留在范围之外,并且在实现之前不可见。谢谢你的建议,我会珍惜你的建议。我更改了查询按钮的条件,现在它可以工作了。因为这是最后一块,所以我想让所有东西都先运行起来。现在我将开始抛光+重构,更彻底地研究您的建议。再次感谢!这种差异可能看起来很小,但是程序员经常需要注意这个特殊的细节,因为差异很大。谢谢你的反馈。事实上,我是从
=
开始的,但不知何故,条件的第二部分没有执行,而是呈现了一个新的视图。
&&
使用了一种称为“短路求值”的方法,这意味着如果表达式的左半部分返回
false
,则不需要求值表达式的右半部分。我会确保
@order.last_step?
true
,否则
@order.payment
将永远不会被检查。谢谢您的回复!在我上次的视图中,相同的条件
elsif@order.last_step?&&@order.payment==“电汇”
有效。只有控制器语句不知何故不起作用…谢谢大家,我学到了很多!我不得不更改语句并使用params[:somebutton],现在它可以工作了,我可以开始重构和改进了。我会接受答案。。。虽然它没有完全解决我的问题,但它果断地为我指明了正确的方向,是最明智的选择