Ruby on rails 与带下划线的名称一起使用时,可能会出现给定错误
我使用CanCan进行授权,除了我尝试为名称中带有下划线的任何类设置授权,例如message_board,它工作正常。例如,以下方法可以很好地工作: 能力.rbRuby on rails 与带下划线的名称一起使用时,可能会出现给定错误,ruby-on-rails,cancan,Ruby On Rails,Cancan,我使用CanCan进行授权,除了我尝试为名称中带有下划线的任何类设置授权,例如message_board,它工作正常。例如,以下方法可以很好地工作: 能力.rb can [:read, :create, :destroy], Message do |message| message.user_id == user.access_id end 但当我添加以下内容时: can [:create, :read], Message_board do |board|
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
你知道怎么解决这个问题吗?谢谢 解决方法:不要在类名中使用下划线 我知道这听起来有点像老笑话中的医生(病人:“医生,我这样做会痛的!”医生:“不要那样做。”),但其实这背后有一个原因
Rails对于命名约定非常固执己见。类名应为大写(
MessageBoard
,或FooBarThing
)。包含该类的文件是带下划线的downcase版本(message\u board.rb
或foo\u bar\u thing.rb
)。因为总是这样,Rails认为它“知道”如何从一个转换到另一个,因此它“知道”在哪里查找包含给定名称的类的文件。如果名称没有按预期的方式排列,可能会出现问题。也许可以说服它以其他格式工作,但我想不出这样做的理由。如果你不遵守约定,不要期望框架工作。你的留言板类定义在哪里?我还建议对类名使用默认的CamelCase符号。我有点像rails的noob,我想我对命名约定感到困惑!修正了权限中的代码,称之为留言板等,现在可以使用了。谢谢你。