当我尝试在远程操作中设置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调用发回,我哪里出错?
答案 0 :(得分:0)
我不确定这是不是问题,但是如果你试图通过Ajax创建一个cookie,那么这并不意味着你必须刷新HTTP请求才能使这个cookie与Rails一起工作?
你可以做几件事来测试这个:
cookie
(以查看是否已设置))Rails.logger.info()
命令以查看是否正在设置Cookie <强>刷新强>
#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