我有两个模型:User
和Dream
。 User
has_many :dreams
和Dream
belongs_to :user
。我有两个控制器供用户和梦想使用。我想使用Dream
创建新的form_for
,并引用特定的User
。但它不应该由我指定,它应该以某种方式(这就是我被困住的地方)追踪User
的页面我按"Create new dream"
,并为此创建{{1} }}
我设法通过仅使用用户控制器(用于管理Dreams),在URL中传递User
参数和隐藏字段来实现此目的。但我意识到这不是一个好方法,因为任何人都可以编辑网址或隐藏字段的值,并为任何user_id
创建新的Dream
。
我正在寻找一种让两个控制器在引擎盖下相互通信的方法。或者这可能不是我需要的东西,我想念MVC或其他任何概念上的细微差别。我需要有人帮助我朝着正确的方向前进。
答案 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)
我认为这就是事情的完成方式。
有关:
任何人都可以编辑网址或隐藏字段的值,并为任何用户创建新的梦想
moderator
,superadmin
,admin
authentication
无法完成您必须使用的authorization
机制cancan
,cancancan
,pundit
等方法。如果任何用户修改隐藏字段值,您必须检查他是否有权这样做。