【问题标题】:Rails 3 routing: include flash params with root redirectRails 3 路由:包括带有根重定向的 flash 参数
【发布时间】:2012-03-07 14:05:03
【问题描述】:

在 Rails 3 中,您可以设置根路径以直接从 config/routes.rb 重定向到其他地方:

root :to => redirect("/dashboard")

这可行,只是它会清除所有传递给 root 的 flash 参数。如何通过重定向传递它们?

更新:James Chen's solution,即将路由声明重写为root :to => redirect { |p, req| req.flash.keep; "/dashboard" },对我有用。但是有两点我不明白:

  1. p 代表什么,参数?
  2. 我尝试使用do/end 和换行符重写该块:

    root :to => redirect do |p, req|
      req.flash.keep
      "/dashboard"
    end
    

    但这会失败,并显示“ArgumentError:不支持重定向参数”。这是为什么呢?

【问题讨论】:

  • 1.是的,p 代表参数。 2.这很有趣。看来我们这里有订单问题。如果我们将() 放在redirect do 块周围,那么它就可以工作。我总是使用{},因为如果块太复杂,这表明我们应该为此编写一个类。
  • 关于2,使用花括号和使用do/end定义块是不一样的。 Ruby iterprets 如下:root(:to => redirect) do # block passed to #root -parentheses can be obviated- 使用花括号时root :to => redirect{ #block passed to #redirect }
  • @Macario 你是说没有括号,Ruby 将块解释为传递给root 而不是redirect
  • 带或不带括号是相同的,在这种情况下,使用 do/end 块将块传递给根,而使用花括号块将其传递给 #redirect 。这里是 Ruby 语法可以咬人的地方。

标签: ruby-on-rails ruby-on-rails-3 redirect routing


【解决方案1】:

使用flash.keep

在你的路由文件中为重定向编写一个过程:

root :to => redirect { |p, req| req.flash.keep; "/dashboard" }

所以从正常重定向到根 url 的 flash 参数将被传递:

redirect_to root_url, :notice => "test flash notice"

【讨论】:

  • 更新了 OP 并跟进您的回答。
【解决方案2】:

你为什么不做类似的事情

root :to => 'dashboard#index'

假设 '/dashboard' 导致仪表板控制器索引操作。

更新

我的意思是,如果你真的想要,你可以添加到“/dashboard”处显示的 html.erb 页面

然后做这样的事情

<% if request.referer.scan('yoursitename').size == 0 %>
 <%= create your own notice here %>
<% end %>

再次编辑...叹息..

忘了,你可以root :to =&gt; 'whateveryouroriginal#rootareawas' 然后就做:

redirect_to '/dashboard'

在你原来的控制器根区操作中

这真的很脏,但是凌晨 2 点,我必须从伊利诺伊州开车去乔治亚州。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2015-06-12
    • 2011-10-04
    • 2020-02-13
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多