如何使用ruby中不同表中的方法

时间:2017-08-10 11:55:02

标签: ruby-on-rails ruby

我正在尝试仅在我的帖子视图中向管理员用户显示按钮,但我收到此错误:

  

未定义的方法`admin?'为零:NilClass

摘录来源:

<% if current_user.admin? && !current_user?(user) %>
  <%= link_to "Edit", edit_post_path(@post), class: "btn btn-warning" %>
  <%= link_to "Delete", post_path(@post),
                  method: :delete,
                  data: {confirm: "Are you sure you want to delete this blog post?"},
                  class: "btn btn-danger" %>
<% end %>

这是我的“用户”表:

create_table "users", force: :cascade do |t|
  t.string   "username"
  t.string   "first_last_name"
  t.string   "email"
  t.string   "password_digest"
  t.datetime "created_at",                        null: false
  t.datetime "updated_at",                        null: false
  t.string   "remember_digest"
  t.boolean  "admin",             default: false
  t.string   "activation_digest"
  t.boolean  "activated",         default: false
  t.datetime "activated_at"
  t.string   "reset_digest"
  t.datetime "reset_sent_at"
  t.index ["email"], name: "index_users_on_email", unique: true
  t.index ["username"], name: "index_users_on_username", unique: true
end

这是我的“帖子”表:

create_table "posts", force: :cascade do |t|
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string   "title"
  t.text     "body"
end

这是我的Sessions_helper.rb中的current_user方法,通过include SessionsHelper在我的application_controller.rb中使用。

# Returns true if the given user is the current user.
def current_user?(user)
  user == current_user
end

# Returns the user corresponding to the remember token cookie.
def current_user
  if (user_id = session[:user_id])
    @current_user ||= User.find_by(id: user_id)
  elsif (user_id = cookies.signed[:user_id])
    user = User.find_by(id: user_id)
    if user && user.authenticated?(cookies[:remember_token])
      log_in user
      @current_user = user
    end
  end
end

如何解决此错误?非常感谢你。

3 个答案:

答案 0 :(得分:1)

在致电#admin之前?你必须检查'current_user'(为什么不使用Devise?)实际上是否存在。检查用户是否确实已登录。如果#present?将返回false,甚至不会检查#admin?因此不会抛出异常。

<% if current_user.present? && current_user.admin? %>

但总的来说,我真的建议使用 cancancan gem,以便将来不再重复这些验证。

答案 1 :(得分:0)

基本上,您收到的错误是指您的current_user未设置。因此,请尝试调试current_user方法,但我认为cookies.signed[:user_id]session[:user_id]未设置,因此您无法找到没有id的任何用户!

我的建议是打印整个session[:user_id]&amp;&amp;在cookies.signed[:user_id]方法的顶部current_user,您将看到具体问题在哪里。

答案 2 :(得分:0)

您似乎正在比较两个值,如果我正确,那么您应该与==而不是=进行比较 例如 (user_id = session [:user_id])应该是(user_id == session [:user_id])