我正在使用Devise with Rails进行用户登录。这一切都很好,但是,我无法获得特定的重定向工作。
我是rails的新手,所以我正在做的事情可能不正确。
基本上,举个例子,我允许用户喜欢帖子。但是,他们需要登录才能这样做。我在我的控制器中创建了一个名为'like'的动作,控制器有一个设计过滤器
before_filter :authenticate_user!, :except => [:index, :show]
输入,显示登录页面。一旦用户登录,我想将他们重定向回他们喜欢的帖子,并且已经调用了“喜欢”的动作。
我的控制器看起来像
def like
@post = Post.find(params[:id])
@like = Like.new;
@like.user_id = current_user.id;
@like.post_id = params[:id];
respond_to do |format|
if @like.save
format.html { redirect_to @post, notice: 'You have like this post' }
format.json { head :no_content }
else
format.html { redirect_to @post, notice: 'Sorry you like was not saved }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
当然,我无法使用after_sign_in_path_for
对路径进行硬编码def after_sign_in_path_for(resource)
#path to somewhere
end
但是我已经读过我可以使用会话变量并且可能在上面的代码中调用它。在Rails的哪一部分我可以编写会话变量,因为它在控制器动作中为时已晚(因为设计在它执行类似动作之前接管)并且我无法看到如何在视图中设置它。
此外,我的链接看起来像
<%= link_to "Like", {:controller => :posts, :action => :like, :id => @post.id}, {:method => :post } %> |
PS使用创建新“帖子”时的重定向工作正常,即用户登录并重定向到新的帖子视图。
非常感谢任何帮助和提示。
由于
答案 0 :(得分:4)
您遇到了这种情况,因为类似的操作是专为POST设计的。因此,您应该确保用户在之前登录到该网址,并且使用会话进行操作非常棘手:
before_filter
user_signed_in?
(请注意,这是一个辅助方法),看到所有这些舞蹈都以 GET 请求结束,为什么不让Like操作在GET请求上工作以及首先在查询字符串中传递参数?这将需要0代码更改,它不会让您暴露于安全威胁,因为Like受before_filter保护。您只需使用<a>
代码上的rel="nofollow"确保搜索引擎不会关注您的赞联链接。
有关相关讨论,请参阅redirect_to using POST in rails。在那里,其中一个建议是通过JavaScript在客户端上构建和提交表单。一旦用户进行了身份验证,就必须在该返回URL视图上进行此操作。如果你反对将你喜欢的行为暴露为GET(违反REST原则),那么这可能是最好的妥协
答案 1 :(得分:0)
这很容易解决:
进入应用程序控制器:
# after login redirect
after_filter :store_location
def store_location
# previous url save when its not a admin or user url
session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/ || request.fullpath =~ /\/admin/ || request.fullpath =~ /\/admin\/login/ ||
request.fullpath =~ /\/login/
end
最好的问候
马塞罗