【问题标题】:Form_for a Nested Resources Permissions (Y Model)Form_for 嵌套资源权限(Y 模型)
【发布时间】:2010-10-11 22:18:58
【问题描述】:

真的可以使用你的帮助,了解这个复杂的导轨问题,我一直在用头撞墙……

我有以下型号:

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

但这不起作用,错误:

  • 如果(用户和项目)的条件在 DB 中没有任何记录:“未定义方法 `model_name' for NilClass:Class”

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

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

有人在 Rails 3 中体验过这种类型的关系吗?感谢您提供任何可以发送给我的提示。

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

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

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

【问题讨论】:

  • 刚刚更新,所以“进度”仍然没有工作
  • 能够将 FORM 更新为“”,但这仅适用于创建新权限。如何显示当前权限,然后允许用户创建/更新?谢谢!
  • 还尝试了“@permission = @project.permissions.find_by_user_id(params[:user_id])”,但得到的是:“NilClass:Class 的未定义方法 `model_name'”
  • 刚刚更新了问题,使其更加清晰。希望。如果不是,请告诉我。谢谢
  • 您发布了您的路由文件(这些模型特有的部分),以及您希望表单路由到哪个控制器操作?

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


【解决方案1】:

对于第一个错误,你有一个 nil 对象,你应该在任何你将对象传递给表单的地方传递一个空白对象,例如@permission ||= @project.permissions.new(假设它是导致 nil 对象的权限对象。或者更漂亮@ 987654322@.

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

【讨论】:

  • @Jeremy,谢谢...在日志中,它没有查询权限表。
  • @Jeremy,我的错误是......你能告诉我它显示当前设置(如果有)并允许用户修改的表单......这是正确的设置吗? ""
  • 这表明@permission 不是 Permission 对象的实例。尝试将debugger 放在您的form_for 调用之前,并使用rails server --debugger 启动您的网络服务器。检查@permission 对象中实际存储的内容
  • find_or_initialize 基本上采用您正在搜索的条件(这里它已经属于@project,并且具有给定的user_id),如果没有找到这些记录,那么它基本上会返回@project.permissions.new(:user_id =&gt; params[:user_id])(尚未保存到数据库的新对象)。使用它的原因是,如果你传入这个空白对象而不是 nil,表单可以检测到你想要创建的对象(因为记录不存在,它应该自动路由到权限#create而不是权限#update)。
  • 在您刚刚发布的代码中,#update 可能会因尚不存在的权限而中断。这有点难看,但您可以尝试使用&lt;%=form_for [:project, @permission], :url =&gt; { :action =&gt; (@permission.new_record? ? "create" : "update") } do |f| %&gt;(如果@permission 是数据库中尚不存在的对象,则new_record?返回true)。
猜你喜欢
  • 2011-01-03
  • 2011-01-16
  • 2012-07-08
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多