Ruby on rails 嵌套资源权限的表单_(Y模型)

Ruby on rails 嵌套资源权限的表单_(Y模型),ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我真的需要你的帮助,理解这个复杂的rails问题,我一直在用头撞墙 我有以下型号: Permissions (user_id, role_id, project_id) Roles (id, name) Projects (id, name) 权限是角色和项目的Y模型 我正在努力制作一个表单,允许用户添加或更新用户的项目权限 在控制器中,我有: @project = Space.find(params[:project_id]) @permission = @project.permiss

我真的需要你的帮助,理解这个复杂的rails问题,我一直在用头撞墙

我有以下型号:

Permissions (user_id, role_id, project_id) 
Roles (id, name) 
Projects (id, name)
权限是角色和项目的Y模型

我正在努力制作一个表单,允许用户添加或更新用户的项目权限

在控制器中,我有:

@project = Space.find(params[:project_id])
@permission = @project.permissions.find_by_user_id(params[:user_id])
然后在视图中:

<%=form_for [:space, @permission] do |f| %>....
控制器 -用户授予CRUD权限选项的路径:
/projects/3/permissions

-我想我应该使用Permissions.rb def Show和def Update来获取和设置权限?

对于第一个错误,当您有一个nil对象时,您应该在向表单传递对象的任何位置传递一个空白对象,例如
@permission |=@project.Permissions.new
(假设是权限对象导致了nil对象。或者是更高级的
@project.permissions.find\u或\u initialize\u by_user\u id(params[:user\u id])


对于第二个错误,奇怪的是它试图映射到destroy,它应该尝试映射到:update action right?运行
rake routes
查看应用程序中的所有路由,以验证PUT/projects/:project\u id/permissions/:id操作是否存在并映射到permissions#update

刚刚用so“progress”更新仍然不起作用Yetwa可以将表单更新为“”,但这只适用于创建新权限。如何显示当前权限,然后允许用户创建/更新?谢谢!还尝试了“@permission=@project.permissions.find by_user_id(params[:user_id])”,但我得到了:“NilClass:Class的未定义方法`model_name'”刚刚更新的问题更清楚。希望如此。如果不是,请告诉我。谢谢你发布了你的路由文件(这些模型特有的部分),以及你希望表单路由到哪个控制器操作?@Jeremy,谢谢……我刚刚用你的建议更新了我的权限控制器:“@permission=@project.permissions.find_或_initialize_by_user_id(params[:user_id])”没有错误,但在日志中,它没有查询权限表。@Jeremy,我的错误是……你能告诉我显示当前设置(如果有)并允许用户修改的表单吗……这是正确的设置吗?”"这表明@permission不是permission对象的实例。请尝试将
调试器
放在
表单\u for
调用之前,然后使用
rails server--debugger
启动Web服务器。检查@permission对象
查找或初始化
中实际存储的内容基本上满足您的条件在上搜索(这里它将已经属于@project,并且具有给定的用户id),如果没有找到这些记录,那么它实际上返回
@project.permissions.new(:user\u id=>params[:user\u id])
(尚未保存到数据库的新对象)。使用此选项的原因是,如果您传入此空白对象而不是nil,则表单可以检测到您要创建的对象(因为记录不存在,它应该自动路由到权限#创建而不是权限#更新)。在您刚刚发布的代码中,它可以用于#更新,该更新可能会因尚未存在的权限而中断。这有点难看,但您可以尝试使用
{:action=>(@permission.new|u record???“create”:“update”)}do | f |%>
(如果@permission是数据库中尚不存在的对象,则返回true)。
resources :projects do
  resources :photos, :permissions
    collection do
        get 'yourcurrentprojects'
    end
end