Rails Michael Hartl教程+设计current_user?

时间:2013-05-28 17:13:48

标签: ruby-on-rails devise

我正在尝试在我的rails composer,设计应用程序中实现M. Hartl的教程中的以下操作。

但由于某种原因,我得到了这个错误

undefined method `current_user?' for 

使用此代码时

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>

知道为什么吗?

由于

2 个答案:

答案 0 :(得分:3)

默认情况下,Devise会为您提供current_user帮助器。但是,它不会为您提供current_user?布尔方法。您需要自己在application_helper.rb

中定义此方法
def current_user?(user)
  user == current_user
end

现在您已定义current_helper?,您可以传入@user实例变量

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>

这就是你要做的一切。您无需以任何方式触摸ApplicationController or SessionsHelper。您只是使用current_user,Devise会为您定义current_user?(user)。这种方式更容易实现。希望这有帮助

答案 1 :(得分:1)

更新

希望您应该进行以下设置:

您的ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper

  # Force signout to prevent CSRF attacks
  def handle_unverified_request
    sign_out
    super
  end

   private
    def current_user
        @current_user ||= User.find(session[:user_id]) if session[:user_id]
    end
     helper_method :current_user

  def authorize
    redirect_to login_url, alert: "Not Autherized" if current_user.nil?
  end

  def track_activity(trackable, action = params[:action])
    current_user.activities.create! action: action, trackable: trackable
  end
end

您还应该有sessions_helper

module SessionsHelper
  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end
  def signed_in?
    !current_user.nil?
  end
  def current_user=(user)
    @current_user = user
  end
  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  def current_user?(user)
    user == current_user
  end
  #CHECK THE ABOVE LINE! 
  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end
end

然后,您可以在视图中执行以下操作:

   <% unless current_user?(@user) %>
      <div id="follow_form">
      <% if current_user.following?(@user) %>
        <%= render 'unfollow' %>
      <% else %>
        <%= render 'follow' %>
      <% end %>
      </div>
    <% end %>