0

我正在尝试在我的 Rails 作曲家设计应用程序中实现 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 %>

知道为什么吗?

谢谢

4

2 回答 2

3

Devisecurrent_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_userDevise 为您提供的定义current_user?(user). 这种方式更容易实现。希望这可以帮助

于 2013-05-28T19:17:43.617 回答
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 %>
于 2013-05-28T17:45:30.230 回答