【发布时间】:2019-05-31 05:08:27
【问题描述】:
我正在制作一个基于 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'
仅与== 一起使用,而所有其他仅与= 一起使用。我开始在控制器中只使用==,但是当我这样做时,什么都没有被执行并且新的被渲染。
提前谢谢你!
【问题讨论】:
-
看到像
thirdlast_step?这样的方法有点令人担忧。也许有更好的表达方式,比如将其转向case以分解步数和:commit参数。 -
是的,我确实很担心;0)。我还没有重构,但只添加了两个步骤来查看条件导航是否可以工作。
-
请注意,本教程确实看起来过于复杂并且有点过时(Rails 3.2?),所以请谨慎对待它的建议。
-
查看这段代码我不确定这是最好的方法。您最好保存一条设置了某种“待处理”或“不完整”标志的记录,并在每个请求之间向前推进,并根据需要添加数据。最后一步将标志关闭,使其“真实”。这种方法似乎是滚雪球方法,其中参数在视图中累积并每次来回踢。这通常比拥有一张包含(可能)不完整记录的表要混乱得多,您需要将其保持在范围之外并且在变为现实之前是不可见的。
-
感谢您的建议,我会珍惜的。我更改了条件以查询按钮,现在它可以工作了。因为这是最后一块,我想让一切都先运行。现在我将开始更彻底地完善和重构您的建议。再次感谢!
标签: ruby-on-rails ruby ruby-on-rails-3 conditional