Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 与带下划线的名称一起使用时,可能会出现给定错误_Ruby On Rails_Cancan - Fatal编程技术网

Ruby on rails 与带下划线的名称一起使用时,可能会出现给定错误

Ruby 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|

我使用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|
        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,我想我对命名约定感到困惑!修正了权限中的代码,称之为留言板等,现在可以使用了。谢谢你。