2013-05-28 96 views
0

我想在我的rails composer,devise app中實現M. Hartl的教程中的後續操作。Rails Michael Hartl教程+設計current_user?

但由於某些原因,我使用此代碼

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

任何想法,爲什麼當得到這個錯誤

undefined method `current_user?' for 

感謝

+0

你是否在任何地方定義過'current_user?'?我認爲設計有'current_user'和'user_signed_in?'方法,但不是你正在使用的方法。 https://github.com/plataformatec/devise –

+0

請給章節號。 – sethi

+0

mind.blank,我已經檢查過該鏈接,它爲current_user提供的方法與我的代碼 @bapusethi相同,如代碼11.23所示。 – PMP

回答

3

設計爲您提供了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。您只需使用Devise爲您提供的current_user以定義current_user?(user)。這種方式更容易實現。希望這有幫助

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 %> 
+0

我已經改變了,但現在我得到這個錯誤=>未定義的方法'以下?' for nil:NilClass – PMP

+0

你的問題在於,當你得到這個錯誤時,下面的變量很可能是空的。你究竟在哪裏設置「跟隨」? – David

+0

好吧,現在它的工作 – PMP

相關問題