当前位置: 首页 > 知识库问答 >
问题:

Rails设计登录后重定向

柯凯旋
2023-03-14

我使用设计与Rails为我的用户登录。这一切都很好,但是,我无法得到一个特定的重定向工作。

我是rails新手,所以我做事的方法可能不正确。

本质上,通过一个例子,我允许用户喜欢一个帖子。然而,他们需要登录才能这样做。我在我的控制器中创建了一个名为“喜欢”的动作,控制器具有设计过滤器

before_filter :authenticate_user!, :except => [:index, :show]

此时将显示登录页面。一旦用户登录,我想将他们重定向回他们喜欢的帖子,并调用“like”操作。

我的控制器看起来像

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\u sign\u硬编码路径

def after_sign_in_path_for(resource)    
  #path to somewhere
end

但是我已经读到,我可以使用会话变量,也许可以在上面的代码中调用它。我可以在Rails的哪一部分写入会话变量,因为在控制器操作中已经太晚了(因为Desive在它点击类似的操作之前就接管了),我看不到如何在视图中设置它。

而且我的链接看起来像

<%= link_to "Like", {:controller => :posts, :action => :like, :id => @post.id}, {:method => :post } %> |

PS使用创建新“帖子”时重定向正常,即用户登录并重定向到新帖子视图。

任何帮助和提示将不胜感激。

谢谢

共有2个答案

关玄裳
2023-03-14

这很容易解决:

进入应用程序控制器:

 # 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
长孙淳
2023-03-14

你正在经历这些,因为like action是专为POST设计的。因此,您应该确保用户在发布到该URL之前已经登录,并且使用会话进行登录很棘手:

  • 您必须取消对类似方法的保护,将其排除在before_filter
  • 然后手动检查是否user_signed_in?(请注意,这是一个辅助方法),
  • 然后(如果用户没有登录),在会话中隐藏你喜欢的内容,并重定向到返回URL的登录页面
  • 当用户访问这个返回URL(它将是GET而不是POST)时,您必须查找会话信息,并执行原始喜欢的操作(但到那时用户将登录)。

既然所有这些舞蹈都将以GET请求结束,为什么不首先在GET请求和QueryString中的传递参数上使用类似的操作呢?它将需要0代码更改,并且不会使您面临安全威胁,因为喜欢受到before_filter保护。你只需要通过在你的上使用rel="no跟"来确保你的赞链接不会被搜索引擎跟随。

有关相关讨论,请参阅重定向到使用rails中的POST。在这里,建议之一是通过JavaScript在客户机上构建和提交表单。一旦用户进行了身份验证,就必须在返回URL视图上发生这种情况。如果您反对将类似操作作为GET公开(这违反了REST原则),那么这可能是最好的折衷方案

 类似资料:
  • 我正在开发一个应用程序,它允许用户浏览网站并从任何页面登录(登录链接位于公共标题中)。成功登录后,用户当前将从登录页面重定向到根url。 redirect_to原始页面会更友好。我试图将原始页面的命名路由存储到会话中,但这些似乎是对象,因此无法通过。此外,并非所有路由都带有指定的助手。另一方面,当我将文字路径作为字符串传递给redirect_to时,例如“订单/索引”,Rails将 /action

  • 记录器文件中的日志- org.springframework.Security.Access.event.loggerlistener-安全授权失败,原因是:org.springframework.Security.Access.accessdeniedexception:访问被拒绝;通过身份验证的主体:org.springframework.security.authentication.ano

  • 我想在登录后将用户重定向到同一页面。该场景是,如果用户未登录,将重定向到登录页面。在登录页面上,当他单击一个可用的用户选项时,我想存储用户id,然后将他重定向回他来自的同一页面。为此,我使用以下代码: 在应用程序中提供帮助。rb: 在SigninController中: 在登录/索引页中:

  • MvcConfig方法如下所示:

  • Reducer.js 我想在成功登录后重定向/主页。我如何重定向?

  • 问题内容: 我正在做一个简单的论坛,由一系列论坛组成,每个论坛分别代表首页,主题,postitit,登录名和用户列表页面。在某些页面上,当用户未登录时会出现一个链接。 我想要实现的是在登录后触发重定向(在RequestDispatcher上使用forward()),以便浏览器返回到用户在单击登录链接之前所在的页面。为此,我看到了两种解决方案。 第一种解决方案是使用带有登录按钮的HTML 和一个不可