以下是说明我的问题的方案。我有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,这样我仍然可以创建该关联?
答案 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