Ruby on rails Rails:elsif&&;控制器操作中的条件语句不工作
我正在编写一个基于Ryan Bates教程的多步骤表单。我需要在表单中实现条件导航,事情变得相当复杂 表单内的导航正在工作,但我的控制器中与提交相关的条件存在问题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
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],现在它可以工作了,我可以开始重构和改进了。我会接受答案。。。虽然它没有完全解决我的问题,但它果断地为我指明了正确的方向,是最明智的选择