RoR:项目的路由设计

时间:2015-03-02 05:01:18

标签: ruby-on-rails ruby variables routes symbols

我正在铁路上为两家酒店创建一个新的应用程序。我设法通过添加以下代码来操纵语言

scope "(:locale)", locale: /en|es|fr/ do
   get 'hotels/main'
   get 'hotel1/home'
   get 'hotel1/gallery'
   ...
   get 'hotel2/home'
   get 'hotel2/gallery'
   ...
end

作为交换提供以下路线:

(/:locale)/hotels/main(.:format)
(/:locale)/hotel1/home(.:format)
...
(/:locale)/hotel2/home(.:format)
...

我想要做的是拥有一个名为hotel_name的变量,它有两个选项(hotel1,hotel2),并在routes.rb文件中调用它,这样我就可以在语言之后声明所有可能性,而不是两种选择( hotel1,hotel2)和相关的观点(家庭,画廊,书籍......)。

我尝试使用之前的视图创建一个模型酒店,但这两个酒店就像实例一样,但我不知道它们是否应该保留活动记录,因为我唯一感兴趣的是识别哪一个是活动的,只是就像我所知道的语言是一个符号,但在这种情况下我应该在哪里声明它以及如何操纵它?

由于

更新1

谢谢@ j-plato

我试过这个并且有效:

  scope "(:locale)", locale: /en|es|fr/ do
    scope "(:hotel_name)", name: /hotel1|hotel2/ do
      get 'home', controller: 'hotels', action: 'home'
      get 'gallery', controller: 'hotels', action: 'gallery'
      get 'book', controller: 'hotels', action: 'book'
      get 'tours', controller: 'hotels', action: 'tours'
      get 'directions', controller: 'hotels', action: 'directions'
      get 'visit', controller: 'hotels', action: 'visit'
    end
    get 'index', controller: 'hotels'
  end

然而我无法传递变量hotel_name,因为我没有实例化酒店。那我应该在哪里做呢?虽然这应该给这个/ locale / hotel_name / action它只显示locale / action,因为它找不到hotel_name

这有效

<%= link_to "English", params.merge({:locale = 'en'}) %>

这不是

<%= link_to "hotel 1", params.merge({:hotel_name => 'hotel1'}), home_path %>

我需要做什么才能在酒店之间切换并传递hotel_name参数,就像:locale一样?

1 个答案:

答案 0 :(得分:0)

如果我了解您尝试做什么,您可能希望将所有这些请求路由到酒店控制器,并将hotel_name作为参数传递给控制器​​方法。所以你能做的就是:

get "hotels/:hotel_name/home", controller: "hotels", action: "home"

如果您将其调用为:

http://my_hotel_app.com/fr/hotels/hotel1/home

控制器方法&#34; home&#34;将使用参数调用:hotel_name =&#34; hotel1&#34;