Form_for嵌套资源权限(Y模型)

时间:2010-10-11 22:18:58

标签: ruby-on-rails ruby-on-rails-3

可以真正使用你的帮助,了解这个复杂的轨道问题我一直在敲打着... ...

我有以下型号:

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| %>....

但这不起作用,错误:

  • 如果(user&amp; project)的条件在DB中没有任何记录:“NilClass的未定义方法`model_name':Class”

  • 如果数据库中有记录,则表示用户确实在此项目中有角色:"No route matches {:action=>"destroy", :controller=>"permissions", :project_id=>#<Permission project_id: 3, role_id: 2, user_id: 13>}"

理想情况下,我希望此表单显示当前权限(如果有)给定(Used / Project)...如果没有当前权限,我希望该人能够创建记录。

有人在Rails 3中遇到过这种关系吗?感谢您提供的任何建议。

路由文件(特定于这些模型的部分)

resources :projects do
  resources :photos, :permissions
    collection do
        get 'yourcurrentprojects'
    end
end

控制器   - 用户向CRUD提供权限选项的路径:/projects/3/permissions   - 我相信我想使用Permissions.rb def Show和def Update来获取和设置权限?

1 个答案:

答案 0 :(得分:2)

对于你有一个nil对象的第一个错误你应该传入一个空白对象,无论你将对象传递给表单,例如@permission ||= @project.permissions.new(假设它是导致nil对象的权限对象。或者是发烧友@project.permissions.find_or_initialize_by_user_id(params[:user_id])

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