1

我认为这是一个非常简单的问题,但我读过的任何内容都没有直接回答我的问题:

我有一个标准表格的新产品页面。成功提交表单后,我重定向到自定义控制器操作和名为“谢谢”的视图。

在“感谢”页面上,我希望能够打印刚刚创建的产品名称以及可能的其他一些属性。

如何将刚刚创建的对象传递给我的新操作?现在控制器看起来像这样:

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
4

2 回答 2

2

你有两个相当不错的选择。

首先,您可以调整Thanks_path 路由以获取id 参数,并将其称为redirect_to thanks_path(@product). 然后你可以像任何标准的表演方法一样在你的感谢方法中调用它。值得一提的是,如果您要在感谢屏幕上显示敏感信息,您可能希望使用随机 uuid 而不是 id 来查找产品。

更好的方法可能是根本不重定向,而是将您的视图从简单地绘制表单调整为如下所示:

<% if @product && !@product.new_record %>
  THANK YOU MESSAGE GOES HERE
<% else %>
  EXISTING FORM GOES HERE
<% end %>
于 2013-05-14T04:28:56.363 回答
2

您不能通过重定向发送对象。

有三种方法可以解决您的问题:

  1. 直接渲染'thanks'模板(不是动作#thanks)

    render 'thanks' # thanks template
    

    您可以直接将任何实例变量发送到此模板。#thanks在这种情况下不再需要。

    缺点:不会更改网址。

  2. 通过会话传递消息

    如果你想显示某些消息,你可以准备它并通过or#create发送它(实际上是会话的一部分)。更好,因为您不需要手动清除它。sessionflashflash

    注意:如果消息很大,您可能希望使用 ActiveRecord 作为会话存储,否则默认设置会遇到 CookiesOverflow。

  3. 通过会话发送非常简单的消息说 obj_id

    类似于#2,但我认为这比#2 好。中#thanks,可以根据obj_id是否存在,id是什么来构造复杂的消息,然后通过db查找相关数据。

于 2013-05-14T04:30:37.233 回答