我正在使用Devise with Acts As Follower。设置很简单,用户可以关注名人。我想做的只是允许用户签名关注/取消关注名人。如果未注册的用户点击了关注按钮,我希望他们被重定向到注册屏幕。我知道Devise的before_action :authenticate_user!
,但很难弄清楚如何在我的名人控制器中为我的follow
/ unfollow
行动触发这个可点击事件。
我当前的代码不足之处在于它仅在current_user
已登录时有效。如果不是,则收到错误:undefined method 'following?' for nil:NilClass
。我想知道如何解决这个问题,以及是否可以通过我的rails代码和javascript的切换功能来改进。
名人秀视图
<% if current_user.following?(@celebrity) %>
<%= link_to "Unfollow", unfollow_celebrity_path, method: :post, class: "unfollow", remote: true %>
<% else %>
<%= link_to "Follow", follow_celebrity_path, method: :post, class: "follow", remote: true %>
<% end %>
<%= render _toggle.html.erb %>
切换按钮部分
<script>
$(function() {
$('a').click(function() {
if ($(this).text() == "Unfollow") {
$(this).html("<%= escape_javascript( link_to 'Follow', follow_celebrity_path, method: :post, remote: true) %>").addClass('follow')
} else {
$(this).html("<%= escape_javascript( link_to 'Unfollow', unfollow_celebrity_path, method: :post, remote: true) %>").addClass('unfollow')
}
});
});
</script>
名人控制器
...
def follow
@celebrity = Celebrity.find(params[:id])
if current_user
current_user.follow(@celebrity)
end
end
def unfollow
@celebrity = Celebrity.find(params[:id])
if current_user
current_user.stop_following(@celebrity)
end
end
路线
resources :celebrities do
member do
post :follow
post :unfollow
end
end
答案 0 :(得分:1)
这应该解决它(更新你的if条件):
<% if current_user.present? && current_user.following?(@celebrity) %>
关于用户登录重定向,这应该有效(抱歉,我没有时间进行测试):
<script>
$(function() {
$('a').click(function() {
if ($(this).text() == "Unfollow") {
$(this).html("<%= escape_javascript( link_to 'Follow', follow_artist_path, method: :post, remote: true) %>").addClass('follow').removeClass('unfollow');
} else {
$(this).html("<%= escape_javascript( link_to 'Unfollow', unfollow_artist_path, method: :post, remote: true) %>").addClass('unfollow').removeClass('follow');
}
})
$(".follow,.unfollow").bind("ajax:error", function(data, xhr, status, error) {
if (xhr.status == 401) {
window.location.replace("<%= new_user_session_path %>");
}
});
});
</script>