我正在使用CanCan进行授权,它工作正常,除了我尝试为名称中带下划线的任何类设置授权时,例如留言板。例如,以下工作正常:
ability.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
知道怎么解决这个问题吗?谢谢!
答案 0 :(得分:1)
关于如何解决此问题的想法:不要在类名中使用下划线。
我知道这听起来有点像老笑话中的医生(患者:“医生,当我做这个时疼痛!”医生:“不要这样做。”),但是实际上有一个原因。
Rails对命名约定极为不满。类名应该是高级驼峰案例(MessageBoard
或FooBarThing
)。包含该类的文件是下划线的小写版本(message_board.rb
或foo_bar_thing.rb
)。因为总是如此,Rails认为它“知道”如何从一个转换为另一个,因此它“知道”在哪里查找包含具有给定名称的类的文件。当名称没有按照预期的方式排列时,可能会出现问题。 可能可能说服它以其他格式工作,但我认为没有理由这样做。