LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-17

はじめに

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

参考情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0