使用枚举

时间:2019-02-14 20:04:48

标签: ruby-on-rails enums devise roles

我正在构建一个Rails应用程序,我想拥有两种类型的用户,即卖方和买方。用户可以在注册时选择要注册为卖方或买方的天气。

然后我使用devise创建了用户  在enum role: [:seller, :buyer]

中添加了user.rb

然后创建了迁移以向用户添加角色

rails g migration add_role_to_users

我的迁移看起来像这样:

class AddRoleToUsers < ActiveRecord::Migration
   def change
      add_column :users, :role, :integer
   end
end

我使用的是简单形式,我在users registration form中添加了

<%= f.select :role, User.roles %>

在索引页面上,我正在尝试这样做:

<% if current_user.seller? %>
  <%= link_to 'New Post', new_post_path %>
  <% else %>
  hello
<% end %>

但是我的用户角色以某种方式返回为零,我也检查了控制台,甚至在那里我的用户角色返回为零,有人可以帮助我并告诉我做错了什么。谢谢你

1 个答案:

答案 0 :(得分:0)

假设您运行了rake db:migrate,则您的代码看起来不错。 在控制台中,任何特定用户的角色都返回nil,因为您尚未为其保存任何角色(例如,在控制台中键入nil时必须获得User.last.role)。 但是,如果键入User.last.update_attributes(role: 1),则在User.last的输出中,您应该看到他的角色已被修改,现在为buyer。 如果不是这种情况,请分享您得到的错误。 为了使它在注册时起作用,您必须正确配置注册控制器,以允许Devise使用新参数。您可以在this post中找到所有信息。 简而言之,您可以通过三个步骤进行操作:

1 /在您的文件route.rb中:

devise_for :users, controllers: {
       :registrations => "users/registrations" }

2 /在您的注册控制器中:

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  # GET /resource/sign_up
  def new
    super
  end
  #then the method called in the before action where you permit the parameters
  protected
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :birth_date, :role, :otherkeysyouneed])
  end
end

3 /在您的注册视图中

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= f.select :role, User.roles %>

应该对您进行排序。祝您好运,如果需要,请参考上面的链接文章和Devise文档,更多信息。