Rails 5 - 保持params创建关联的最佳方法?

时间:2017-12-12 07:53:45

标签: ruby-on-rails

以下是说明我的问题的方案。我有2个型号:

# models/post.rb

belongs_to :user
validates_presence_of :comment

我们有一个名为Users

的设计模型
# models/user.rb

has_many :posts

我想要实现的目标:

人来到网站,能够创建Post,在创建Post后,系统会提示他们创建帐户。创建帐户后,他们刚刚创建的Post将与他们刚刚创建的User相关联。

通常我会使用路由来保存可以在控制器方法中访问的params[:id]。例如,URL可能如下所示:

www.foo.com/foo/new/1

然后我可以这样做:

# foo_controller.rb

def new
  @foo = Foo.new
  @parent = Parent.find(params[:id])
end

在视图中,我只需访问@parent并使用隐藏字段填充父ID。

但是当通过这么多不同的页面进行路由时(例如创建一个Devise用户),我如何保留父/子ID,这样我仍然可以创建该关联?

1 个答案:

答案 0 :(得分:2)

使用隐藏字段或路径存储id,在此过程中没有授权,将不安全。如果我只使用浏览器检查器并更改id的值,该怎么办?你的酷帖子将是我的。

例如,你可以做的是在帖子中添加一个名为guest_id的字段,其中值是唯一的(如SecureRandom.uuid),并且还将该值存储在会话中。< / p>

因此,在创建用户之后,您可以执行类似的操作

if (post = Post.find_by(guest_id: session[:guest_id])).present?
  post.update(user_id: current_user.id)
end