如何使用父模型的引用创建新模型条目

时间:2015-10-06 01:51:15

标签: ruby-on-rails ruby

我有两个模型:UserDreamUser has_many :dreamsDream belongs_to :user。我有两个控制器供用户和梦想使用。我想使用Dream创建新的form_for,并引用特定的User。但它不应该由我指定,它应该以某种方式(这就是我被困住的地方)追踪User的页面我按"Create new dream",并为此创建{{1} }}

我设法通过仅使用用户控制器(用于管理Dreams),在URL中传递User参数和隐藏字段来实现此目的。但我意识到这不是一个好方法,因为任何人都可以编辑网址或隐藏字段的值,并为任何user_id创建新的Dream

我正在寻找一种让两个控制器在引擎盖下相互通信的方法。或者这可能不是我需要的东西,我想念MVC或其他任何概念上的细微差别。我需要有人帮助我朝着正确的方向前进。

3 个答案:

答案 0 :(得分:1)

如果您有登录功能,那么您可以在ApplicationController中定义一个方法,该方法返回与请求提供的会话令牌匹配的用户,然后执行current_user.dreams.create(params),这将创建一个带有参考的梦想至current_user返回的任何用户,并且从未将有关用户的任何信息放入客户的视图中。

如果您没有登录功能,那么我不会担心它可以被编辑,因为在那时任何人都可以为任何其他用户创造梦想访问该页面。

编辑:例如我经常使用这样的东西:

def current_user
  @current_user ||= User.find_by(session_token: session[:session_token])
end

答案 1 :(得分:1)

您可以在DreamsController中为新操作添加可选的user_id参数。这个参数构建了该用户的新梦想。

def new
  user_id = params[:user_id]
  @dream = if params[:id].present?
             User.find(params[:id]).dreams.build
           else
             Dream.new
           end
end

然后您的链接就像

<%= link_to "Create New Dream", {:controller => "dream", :action => "new", user_id: user[:id]}%>

答案 2 :(得分:0)

我认为这就是事情的完成方式。

有关:

  

任何人都可以编辑网址或隐藏字段的值,并为任何用户创建新的梦想

  • 如果你有一个用户通过应用程序,他可以做任何事情;他是superAdmin
  • 如果有多个用户
    • 他们必须扮演不同的角色; moderatorsuperadminadmin
    • 在这种情况下;仅authentication无法完成您必须使用的authorization机制cancancancancanpundit等方法。
    • 这些基本上可以防止任何用户做出令他们未经授权的事情。

如果任何用户修改隐藏字段值,您必须检查他是否有权这样做。