Ruby on Rails 5设计自定义字段不起作用

时间:2016-07-22 19:17:36

标签: ruby-on-rails devise

我遇到了设计自定义字段Ruby on Rails 5.0的问题。我正在使用设计来处理用户帐户维护。我已成功将一个名为admin_user的自定义字段添加到我的用户模型中。该字段是布尔字段。我创建了一个会话变量来保存用户是否是我的应用程序控制器中的回调函数中的管理员用户 这个想法是,当用户登录时,如果他们是管理员用户,他们将看到管理员菜单。如果他们是普通用户,他们就不会。这似乎不起作用。我担心数据库不会将admin用户存储为布尔字段。该值在数据库中显示为t或f,因此我不知道这是否意味着它们的值是文本值,或者实际上是布尔值。
无论我尝试什么,以下都不起作用。系统似乎认为所有用户都不是管理员用户。谁会对错误有任何想法。
基于以下内容,我所做的应该是正确的:
how to add admin with devise in ROR

Set a session variable in devise on sign in

我可以使用ruby代码current_user.admin_user吗?代替。我已经尝试了这一点,但不幸的是它没有用。

<% if session[:admin_usr]  %> 
  <div id="adminMenu" name="adminMenu" class="dropdown">
    <button class="dropbtn">Admin</button>
    <div class="dropdown-content">
      <a href="/brands">Brand</a>
      <a href="/products">Product</a>
      <a href="/categories">Category</a>
    </div>
  </div>
<% else %> 
  <div id="profileMenu" name="profileMenu" class="dropdown">
    <button class="dropbtn">Profile</button>
    <div class="dropdown-content">
      <a href="/addresses">Addresses</a>
      <a href="/payments">Payments</a>
      <a href="/payments">Orders</a>
    </div>
  </div>
<% end %> 

部分数据库表列表

id = 1
email = asas.com
admin_user = t

id = 2
email = s@s.com
admin_user = f

数据库表列表

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                             null: false
    t.datetime "updated_at",                             null: false
    **t.boolean  "admin_user",             default: false**
    t.integer  "addresses_id"
    t.integer  "sales_orders_id"
    t.integer  "payments_id"
    t.index ["addresses_id"], name: "index_users_on_addresses_id"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["payments_id"], name: "index_users_on_payments_id"
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
    t.index ["sales_orders_id"], name: "index_users_on_sales_orders_id"
  end

控制器代码

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  # GET /categories
  # GET /categories.json
  def index
    @categories = Category.all
  end
  before_filter :load_initial_data

 protected
  def after_update_path_for(resource)
    session[:admin_usr] = current_user.admin_user
    user_path(resource)
  end
  def load_initial_data
    @categories = Category.all
  end
end

1 个答案:

答案 0 :(得分:1)

我非常抱歉人们在我写完这个问题后,可能的解决方案在我身上恍然大悟。我应该在发布之前对此进行测试,但也许如果我没有发布问题,我就不会找到解决方案。使用以下代码可以解决问题。这也意味着我不需要应用程序控制器中的回调方法。我认为从积极的方面来说,解决问题有助于我解决问题。我希望通过这里发布它可以帮助其他人。

<% if current_user.admin_user %>
  <div id="adminMenu" name="adminMenu" class="dropdown">
    <button class="dropbtn">Admin</button>
    <div class="dropdown-content">
      <a href="/brands">Brand</a>
      <a href="/products">Product</a>
      <a href="/categories">Category</a>
    </div>
  </div>
 <% else %> 
  <div id="profileMenu" name="profileMenu" class="dropdown">
    <button class="dropbtn">Profile</button>
    <div class="dropdown-content">
      <a href="/addresses">Addresses</a>
      <a href="/payments">Payments</a>
      <a href="/payments">Orders</a>
    </div>
  </div>
<% end %>