为什么Rails在使用AJAX时没有正确设置cookie变量?

时间:2014-02-02 01:21:13

标签: ruby-on-rails ajax cookies

当我尝试在远程操作中设置cookie时,它没有正确设置。

的Ajax:

控制器/故事:

def vote
    unless cookies[params[:story_id]]
        @story = Story.find(params[:story_id])
        @story.rating += 1
        @story.save
        cookies[params[:story_id]] = true
    end
end

视图/故事:

<% unless cookies[story.id] %>
    <%= link_to "▲", story_vote_path(story), :remote => true, :method => "put", class: :vote %>
<% end %>

非Ajax:

控制器/故事:

def vote
    unless cookies[params[:story_id]]
        @story = Story.find(params[:story_id])
        @story.rating += 1
        @story.save
        cookies[params[:story_id]] = true
    end
    redirect_to root_url
end

视图/故事:

<% unless cookies[story.id] %>
    <%= link_to "▲", story_vote_path(story), :method => "put", class: :vote %>
<% end %>

在以前的代码中,无论链接是否被点击,它仍然会出现并可用于再次投票。但是在后者中,链接不再出现,您无法再次投票。 我看了一下,发现set_cookie标头可以从ajax调用发回,我哪里出错?

1 个答案:

答案 0 :(得分:0)

我不确定这是不是问题,但是如果你试图通过Ajax创建一个cookie,那么这并不意味着你必须刷新HTTP请求才能使这个cookie与Rails一起工作?

你可以做几件事来测试这个:

  1. 刷新页面(并在视图中包含cookie(以查看是否已设置))
  2. 设置Rails.logger.info()命令以查看是否正在设置Cookie
  3. 尝试其他方法

  4. <强>刷新

    #app/views/stories/show.html.erb
    <%= cookies[story.id] %>
    

    在视图中包含此代码将输出该cookie的任何内容。这意味着如果您执行ajax请求,您可以刷新页面以查看它是否实际已设置(并且未被您的ajax绑定代码捕获)


    记录器

    unless cookies[params[:story_id]]
        @story = Story.find(params[:story_id])
        @story.increment!(:rating)
    
        cookies[params[:story_id]] = true
        Rails.logger.info(cookies[story.id])
    end
    

    这将在Rails日志中输出cookie,让您查看它是否实际设置


    <强>的Ajax

    看起来您使用Cookie的效率有些低。我更喜欢使用这样的简单respond_to系统:

    #app/controllers/stories_controller.rb
    def vote
        unless cookies[params[:story_id]]
            @story = Story.find(params[:story_id])
            @story.increment!(:rating)
        end
        respond_to do |format| 
            format.html { redirect_to root_url }
            format.js
        end
    end
    
    #app/views/stories/vote.js.erb
    <% if @story %>
        $("a.vote").fadeOut(150, function() {
            $(this).hide();
        });
    <% end %>
    

    每次使用Ajax点击.js.erb操作时,都会调用此vote。它将执行将直接影响预加载页面的功能


    <强> .increment!

    让您的代码干净的东西:

    unless cookies[params[:story_id]]
        @story = Story.find(params[:story_id])
        @story.increment!(:rating)
    
        cookies[params[:story_id]] = true
    end