【问题标题】:CanCan giving error when used with underscored namesCanCan 与带下划线的名称一起使用时出错
【发布时间】:2013-02-15 05:26:54
【问题描述】:

我正在使用 CanCan 进行授权,它工作正常,除非我尝试为名称中带有下划线的任何类设置授权,例如留言板。例如,以下工作正常:

能力.rb

can [:read, :create, :destroy], Message do |message|
        message.user_id == user.access_id
      end

但是当我添加以下内容时:

can [:create, :read], Message_board do |board|
        board.user_id == user.access_id
      end

当我尝试做任何需要授权的事情时,我收到以下错误:

LoadError in TimelinesController#show 
Expected {app_name}/app/models/message_board.rb to define Message_board

知道如何解决这个问题吗?谢谢!

【问题讨论】:

  • 如果你不遵守约定,不要指望框架能正常工作
  • 您的 Message_board 类在哪里定义?我还建议坚持类名的默认 CamelCase 表示法。

标签: ruby-on-rails cancan


【解决方案1】:

关于如何解决这个问题的想法:不要在类名中使用下划线。

我知道这听起来有点像老笑话中的医生(患者:“医生,我这样做时会很痛这个!”医生:“不要那样做。”),但是其实是有原因的。

Rails 对命名约定非常固执己见。类名应为大写字母(MessageBoardFooBarThing)。包含该类的文件是带下划线的小写版本(message_board.rbfoo_bar_thing.rb)。因为总是如此,Rails 认为它​​“知道”如何从一个转换到另一个,因此它“知道”到哪里查找包含具有给定名称的类的文件。当名称不符合预期时,可能会出现问题。 可能可以说服它以其他格式工作,但我认为没有理由这样做。

【讨论】:

  • 我是个小菜鸟,我对命名约定感到困惑!更正了权限中的代码,将它们称为 MessageBoard 等,现在它可以工作了。谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多