ruby-on-rails – Rails在登录后设计重定向
我正在使用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使用创建新“帖子”时的重定向工作正常,即用户登录并重定向到新的帖子视图. 任何帮助和提示将不胜感激. 谢谢 解决方法
您遇到了这种情况,因为类似的操作是专为POST设计的.因此,在POST到该URL之前,应确保用户已登录,并且使用会话执行此操作非常棘手:
>你必须通过从before_filter中排除它来取消保护类似方法 看到所有这些舞蹈都以GET请求结束,为什么不首先让Like动作处理GET请求以及在查询字符串中传递参数?这将需要0代码更改,它不会让您暴露于安全威胁,因为Like受before_filter保护.您只需要在< a>上使用rel=”nofollow”确保搜索引擎不会关注您的“赞”链接.标签. 有关相关讨论,请参阅redirect_to using POST in rails.其中一个建议是通过JavaScript在客户端上构建和提交表单.一旦用户进行了身份验证,就必须在该返回URL视图上进行此操作.如果你反对将你喜欢的行为暴露为GET(违反REST原则),这可能是最好的妥协 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |