はじめに
Rails 6 に追加されそうな新機能を試す第18段。 今回のちょい足し機能は、 options_from_collection_for_select
編です。
Rails 6.0 では options_from_collection_for_select などの View helper からプライベートメソッドにアクセスしようとすると DEPRECATION WARNING が出力されるようになりました。
View から Model のプライベートメソッドにアクセスするのはよろしくないということでしょう。
記載時点では、Rails は 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
Railsプロジェクトを作る
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
scaffold で CRUD を作る
scaffold で User の CRUD 機能を作ります。
$ bin/rails g scaffold User name
Language クラスを追加する
options_from_collection_for_select
を試すためだけに、 Language クラスを作ります。
ここで、 Language#name
メソッドは private
にします。
また、 Language.all
メソッドも定義して、 Language
オブジェクトの配列を返すようにします。
class Language
def initialize(name)
@name = name
end
def self.all
[Language.new('Ruby'), Language.new('Python'), Language.new('Elixir')]
end
private
def name # <= name メソッドは private にする
@name
end
end
UsersController#new を修正する
View に Language オブジェクトの配列を渡すように修正します。
class UsersController < ApplicationController
...
def new
@user = User.new
@languages = Language.all # <= この行を追加
end
...
end
_form.html.erb を編集する
select タグを追加します。 options_from_collection_for_select
を使います。
<%= form_with(model: user, local: true) do |form| %>
...
<%= form.text_field :name %>
</div>
<div class="field">
<%= form.label :language %>
<%= form.select :language, options_from_collection_for_select(@languages, :name, :name) %>
</div>
<div class="actions">
...
<% end %>
rails server を起動して登録画面を表示する
rails server
を実行して、 http://localhost:3000/users/new にアクセスします。
コンソールを確認すると DEPRECATION WARNING
が表示されています。
Started GET "/users/new" for 172.19.0.1 at 2019-05-15 12:09:34 +0000
...
Processing by UsersController#new as HTML
Rendering users/new.html.erb within layouts/application
DEPRECATION WARNING: Using private methods from view helpers is deprecated (calling private Language#name) (called from block in _app_views_users__form_html_erb___2291557581626701879_47392442046000 at /app/app/views/users/_form.html.erb:21)
...
ソースコード
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try018