我认为这是一个非常简单的问题,但我读过的内容并没有直接回答我的问题:
我有一个标准表单的新产品页面。成功提交表单后,我重定向到自定义控制器操作和视图“谢谢”。
在“感谢”页面上,我希望能够打印刚创建的产品的名称以及可能的其他属性。
如何将刚创建的对象传递给我的新动作?现在控制器看起来像这样:
def create
@product = Product.new(params[:product])
if @product.save
flash[:notice] = "Successfully created Product."
redirect_to thanks_path
else
render :action => 'new'
end
end
def thanks
end
答案 0 :(得分:2)
你有两个相当不错的选择。
首先,您可以调整thanks_path路由以获取id参数,并将其称为redirect_to thanks_path(@product)
。然后你可以用你的感谢方法调用它,就像任何标准的show方法一样。值得一提的是,如果您要在感谢屏幕上显示敏感信息,您可能需要使用随机uuid而不是id来查找产品。
更好的方法可能是根本不重定向,而是将视图调整为简单地将表单绘制为类似的内容:
<% if @product && !@product.new_record %>
THANK YOU MESSAGE GOES HERE
<% else %>
EXISTING FORM GOES HERE
<% end %>
答案 1 :(得分:2)
您无法通过重定向发送对象。
有三种方法可以解决您的问题:
直接渲染'thanks'模板(不是动作#thanks)
render 'thanks' # thanks template
您可以直接将任何实例变量发送到此模板。
。在这种情况下不再需要#thanks
。
缺点:网址不会被更改。
通过会话
传送讯息如果您想要显示某些消息,可以在#create
中进行准备,然后通过session
或flash
(实际会话的一部分)发送。 flash
更好,因为您无需手动清除它。
注意:如果邮件大小很大,您可能希望将ActiveRecord用作会话存储,否则您将默认设置为CookiesOverflow。
通过会话发送非常简单的消息说obj_id
与#2类似,但我认为这比#2好。在#thanks
中,您可以根据obj_id是否存在构建复杂消息,id是什么,然后通过db查找相关数据。