使用行为作为追随者和设计进行身份验证

时间:2014-12-11 14:47:23

标签: javascript ruby-on-rails authentication devise controller

我正在使用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

1 个答案:

答案 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>