Rails - 如何将创建的记录从新表单传递到重定向页面

时间:2013-05-14 04:14:31

标签: ruby-on-rails

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

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

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

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

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

2 个答案:

答案 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)

您无法通过重定向发送对象。

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

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

    render 'thanks' # thanks template
    

    您可以直接将任何实例变量发送到此模板。

    。在这种情况下不再需要#thanks

    缺点:网址不会被更改。

  2. 通过会话

    传送讯息

    如果您想要显示某些消息,可以在#create中进行准备,然后通过sessionflash(实际会话的一部分)发送。 flash更好,因为您无需手动清除它。

    注意:如果邮件大小很大,您可能希望将ActiveRecord用作会话存储,否则您将默认设置为CookiesOverflow。

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

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