如果已将特定参数传递给新方法,我需要在create方法的末尾调用方法。我试图这样做而不向我正在创建的对象添加新字段,仅仅是为了成为临时“参数桶”。该参数不会用于创建新对象,而是用于保存对象后调用的辅助方法。
所以代码就像......
def new
@object = Object.new
if params[:object_id]
@object_trade = Object.find(params[:object_id])
end
end
def create
blah create blah
if @object.save && @object_trade.present?
call_method_here(@object_trade.id)
end
end
但是,我不能把这些碎片放在一起。我觉得我错过了一些明显的东西。
对于它的价值,我可以传递对象或仅仅是我需要做的参数。
感谢任何帮助。
答案 0 :(得分:2)
重新定义您的方法如下:
def new
@object = Object.new
if params[:object_id]
session[:object_trade] = params[:object_id]
end
end
def create
blah create blah
if @object.save && session[:object_trade].present?
@object_trade = Object.find(session[:object_trade])
call_method_here(@object_trade.id)
session.delete(:object_trade) ## Remove object_trade from the session
end
end
每次调用操作时,都会加载控制器的单独实例。因此,您不会在@object_trade
操作中获得create
。但会话将允许您在不同操作之间共享数据。
从会话中删除object_trade
的原因,即session.delete(:object_trade)
是在给定时间,每个会话只能执行一次new
操作。这样, antinome(在评论中)提出的问题就不会在if
create
块行动中执行活动。如果OP希望向用户提供消息,那么他只需在flash
部分添加else
消息,说明session key invalid..Please try again
之类的原因并重定向到新表单。
答案 1 :(得分:2)
Kirti Thorat rightly points out为什么实例变量不起作用,但建议使用会话,这可能是错误的。
如果用户使用object_id
导航到“新”页面,但从不提交表单,该怎么办?相反,他们点击后退按钮并发出另一个“新”请求,这次没有object_id
,因为他们改变了主意。但是,object_trace
仍然在会话中闲逛,应用程序错误地记住原始object_id
。
我相信闪光灯会遇到类似的问题。
以“新”操作呈现的形式呈现隐藏字段:
= hidden_field_tag 'object_id', params[:object_id]
然后,当您提交表单时,object_id将被传递,并且可以作为params[:object_id]
用于创建操作。