Railsでモデル名にRubyのキーワードっぽいのを使うと面倒

モデルの名称にうっかりRubyのキーワードを使ってしまうとそのままでは動かなくなる場合があるので、注意です。
試しに、Aliasという名前の単純なモデルでscaffoldを作ってみます。

rails g scaffold alias name:string

で、localhost:3000/aliases/にアクセスし、AliasesControllerのindexメソッドを呼び出します。

SyntaxError in Aliases#index

Showing /Users/suginoyasuhiro/work/sample/app/views/aliases/index.html.erb where line #11 raised:

/Users/suginoyasuhiro/work/sample/app/views/aliases/index.html.erb:11: syntax error, unexpected keyword_alias, expecting '|'
');@output_buffer.append_if_string=  @aliases.each do |alias| 
                                                            ^
/Users/suginoyasuhiro/work/sample/app/views/aliases/index.html.erb:13: syntax error, unexpected '.'
...@output_buffer.append= ( alias.name );@output_buffer.safe_co...
...                               ^
/Users/suginoyasuhiro/work/sample/app/views/aliases/index.html.erb:14: syntax error, unexpected keyword_alias, expecting ')'
(以下略)

見事にビューのエラーが出ました。どうやら、ブロックで変数名がaliasとなっているのがいけないようです。

<% @aliases.each do |alias| %>

なので、aliasからaという変数名に書き換えて再度アクセスしてみると、

ちゃんと表示されました。New/Edit/Destroyはviewのテンプレートを修正せずに動作しました。こちらは@付きの変数で書かれているからのようです。

<p>
  <b>Name:</b>
  <%= @alias.name %>
</p>

Railsの場合、テーブル名に合わせてテーブル名の単数形にするのが一般的で読みやすいと思うので、モデルの名称をキーワードと同じのにしようとこだわると色々めんどうになりそうですね。今回はscaffoldだけで試しましたが、それ以外のところでも何が起こるやら。