1

我正在尝试做一些与这个问题非常相似的事情......

总之,我在页面上有投票逻辑,但要投票,我需要您登录。登录用户的投票逻辑只需:method => :post, :remote => true调用控制器方法,保存投票,然后执行respond_to :jsJavaScript HAML使用 jQuery 替换 HTML 的模板。

对于未经身份验证的用户,当前的工作方式是匿名用户单击“投票”,被重定向到 Devise 登录页面,登录,然后被重定向回他们再次投票的页面。但是,这是一种糟糕的用户体验。

我将如何改变这一点,以便最后一步继续处理他们的投票?

我有投票逻辑的现有 HTML 视图,并且希望简单地继续处理投票,重定向到用户投票的页面,并闪烁一条消息说投票成功。但是,如果使用 JavaScript / jQuery 做到这一点“同样简单”,我会对此持开放态度。我要避免的唯一部分是在 JavaScript 中重新创建设计模板。

4

1 回答 1

2

这种重定向的困难在于表单是通过post请求提交的。Rails 的redirect_to方法发出一个 get 请求,这会阻止您提交表单。

此解决方案不关心您使用的身份验证类型。这是我过去所做的(这是说明过程的伪代码):

如果用户未登录,则将隐藏字段附加到表单并将其 id 分配给随机字符串:

- unless signed_in?
  = hidden_field_tag :submit_token, id: "form_#{rand}" # just generate something random

在检查用户是否登录的控制器过滤器中,检查此参数,并设置会话挂钩(如果存在)。

session[:submit_token] = params[:submit_token] if params[:submit_token].present?

然后在您的create.js.erb(在 ajax 登录后呈现的模板)中检查此会话值。如果它存在,使用它来查找表单并通过 jQuery 提交。

- if session[:submit_token]
  $('#' + session[:submit_token]).parent('form').submit();
  - session[:submit_token] = nil

理想情况下,您将创建帮助方法来设置和删除session[:submit_token]值。

您不能使用更传统的东西(例如store_location方法)的原因是因为它们无法处理发布请求。因此,在将原始发布请求转移到登录之前,您无法重定向回来并继续原始发布请求。

于 2013-07-17T15:36:17.327 回答