Ruby
Rails
Rails6

Rails6 のちょい足しな新機能を試す18(options_from_collection_for_select 編)


はじめに

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 オブジェクトの配列を返すようにします。


app/models/Language.rb

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 オブジェクトの配列を渡すように修正します。


app/controllers/users_controller.rb

class UsersController < ApplicationController

...
def new
@user = User.new
@languages = Language.all # <= この行を追加
end
...
end


_form.html.erb を編集する

select タグを追加します。 options_from_collection_for_select を使います。


app/views/users/_form.html.erb

<%= 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


参考情報