17

ルビー オン レール 4.1

私は列挙型の役割でDeviseを使用しています。現在、ユーザーの作成時にデフォルトの役割が設定されています。ユーザーを作成するフォームにフィールドを追加して、列挙ロールを設定したいと考えています。

私はこれを読みましたが、新しい役割を利用する方法については述べていません。

これはユーザークラスです

devise :database_authenticatable, :registerable, :confirmable,
     :recoverable, :rememberable, :trackable, :validatable
enum role: [:user, :vip, :admin, :developer, :marketing, :support, :translator]
after_initialize :set_default_role, :if => :new_record?

def set_default_role
  self.role ||= :user
end

これは、列挙ロールを選択するために選択しようとしているフォームの一部です。

<div class="form-group">
  <%= f.collection_select :role, User.roles, :id, :enum, {prompt: "Select a role"}, {class: "form-control input-lg"} %>
</div>

エラー:

NoMethodError - undefined method `enum' for ["user", 0]:Array:
actionview (4.1.1) lib/action_view/helpers/form_options_helper.rb:761:in `value_for_collection'

以前に列挙型を使用したことがなく、ドキュメントが役に立たないことが証明されています。列挙オプションを表示するにはどうすればよいですか?

4

5 に答える 5

40

まずenum、属性の名前ではありません。属性の名前はrole.

rails- devise -punditサンプル アプリケーション、具体的にはファイルapp/views/users/_user.html.erbを見てください。これは、管理者がユーザーの役割を変更できるようにするフォームを作成するパーシャルです。for ヘルパーを使用したいとは思いませんcollection_select(別の Role モデルがある場合に適しています)。代わりに、通常のselectフォーム ヘルパーが機能します。

ロール オプションをハードコーディングする簡単な例を次に示します。

<%= f.select(:role, [['User', 'user'], ['Vip', 'vip'], ['Admin', 'admin']]) %>

以下は、ロールをフォームにハードコーディングすることを回避するより良い例です。

<%= f.select(:role, User.roles.keys.map {|role| [role.titleize,role]}) %>

このステートメントは、User モデルからロールの配列を取得し、メソッドを使用してキーと値のペアの配列を構築しますmap

于 2014-06-12T22:54:07.630 に答える
2

ここでは、国際化と順序付けを行った方法を示します。既に定義されている場合は current_user ロールを自動選択します。次のようなすべての列挙ロールを含む roles: カテゴリを持つロケール ファイルがあることを前提としています。

# your locale file
en:
 roles:
  admin: "Administrator"
  mode: "Moderator"


# model user.rb
enum role: { admin: 0, mode: 1 }
ROLES = User.roles.map { |r,| [I18n.t("roles.#{r}"), r] }.sort_by { |r| I18n.t("roles.#{r}") }

# view

<%= f.select :role, User::ROLES, { prompt: t("users.roles.prompt"), selected: @user.role }, { class: "form-control" } %>
于 2016-08-19T22:23:14.917 に答える