我正在尝试在我的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 %>
知道为什么吗?
由于
答案 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 %>