【问题标题】:Controller redirect to different paths depending on previous page控制器根据上一页重定向到不同的路径
【发布时间】:2016-03-09 16:33:41
【问题描述】:

问题:

如果previous_page 是../reader/new 转到../reader/blog/:id,而如果previous_page 是../editor/new 转到../editor/blog/:id,我想在create 操作后重定向到不同的路径。

说明:

我想修改控制器操作,以便它可以根据它来自哪个页面重定向到不同的路径。例如,我有一个readereditorblog 模型。 readereditor 都可以创建blog

这里是原文blogs_controller

    class BlogsController < ApplicationsController        
      def create
        @blog = Blog.new(blog_params)
        respond_to do |format|
          if @blog.save
            format.html { redirect_to @blog }
          else
            format.html { render :new }
          end
        end
      end

      private

      def blog_params
        params.require(:service).permit(:title, :content)
      end
    end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 controller


    【解决方案1】:

    你有几个选择:

    • 如果您只需要重定向返回上一页,请在控制器中使用redirect_to :back
    • 添加一些逻辑处理HTTP referer,即根据控制器中的request.referer决定重定向到哪里
    • 在参数中传递重定向信息create 操作,例如当来自“阅读器”页面时传递params[:redirect_to] = "reader",并根据此参数决定重定向到哪里。您甚至可以将整个 URI 重定向到参数中,然后直接重定向到它(但这种方法是不安全的,因为参数可能会被用户破坏)。

    一般来说,我会选择第三个选项(参数),因为您可以最好地控制重定向过程(前两个选项依赖于 HTTP 引用,它也可能被任何访问者破坏,因此可能不安全)。

    【讨论】:

    • 谢谢,您的第一个和第二个选项可以解决问题。但我无法理解最后一个选项。如何传递参数 [:redirect_to]?你把它放在控制器create action 里面了吗?
    • 对不起,我的意思是params[:redirect_to[,让我进一步解释。例如,我假设您在 reader/new 操作中有一个表单。然后,您可以在此表单中添加一个隐藏字段并将其设置为所需重定向的符号值,例如hidden_field_tag :redirect_to, "reader"。然后这个参数将作为params[:redirect_to] 传递给创建操作,并且控制器的create 操作可以对该参数做出反应并重定向到所需的阅读器页面。我修正了答案中的错字。
    猜你喜欢
    • 2013-11-27
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多