2015-10-06 56 views
0

我有两个模型:UserDreamUserhas_many :dreamsDreambelongs_to :user。我有两个用户和梦想的控制器。我想创建新的Dreamform_for并参考特定的User。但它不应该由我指定,它应该以某种方式(并且这是我卡住的地方)追踪哪个User的页面我按"Create new dream",并为此创建User如何创建一个参考父模型的新模型条目

我设法与仅使用用户控制器(用于管理的梦想也一样),与经过user_id参数中的URL要做到这一点,并与隐藏字段。但是我意识到这不是一个好的方法,因为任何人都可以编辑URL或隐藏字段的值,并为任何User创建新的Dream

我正在寻找一种方法来使两个控制器在引擎盖下相互沟通。或者,也许这不是我所需要的,我错过了MVC或其他任何概念的细微差别。我需要有人把我推向正确的方向。

回答

1

如果您已经登录功能,那么您可以在ApplicationController定义一个方法,返回由请求中提供的会话令牌相匹配的用户,然后做current_user.dreams.create(params),这将创造参照梦想哪个用户是通过current_user返回并且绝不会将有关用户的任何信息放入客户端视图中。

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

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

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

您可以添加一个可选的user_id参数到DreamsController中的新动作。这是PARAM建立在该用户的新梦想。

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]}%> 
0

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

为:

任何人都可以编辑URL或者隐藏字段的值,并且对于任何用户创造新的梦想

  • 如果您有单用户通过在应用软件,他可以做任何事情;他是superAdmin
  • 如果有多个用户
    • 它们必须具有不同的角色; moderatorsuperadminadmin
    • 在这种情况下
    • ;单独authentication不能做所有你所使用的authorization机制的一些方法类似cancancancancanpundit等的事情。
    • 这些基本上阻止任何用户做一些令人讨厌的事情,他们是未经授权的。

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