Rails - 重定向到同一路径中的不同页面

时间:2016-01-24 23:39:44

标签: ruby-on-rails routes

在我的Rails项目中,我有两个不同的页面存在于同一个路径中 - 一个是商店索引,另一个是商店更新页面(虽然我不会使用这些确切的名称)。我遇到的问题是我正在尝试为每个商店的索引页面添加动态链接以将用户带到关联的更新页面,但我手动创建了路由(而不是使用:资源)并列出了两个页面在我的Rails路由摘要中的相同路径下。如何使用<%= link_to%>在这种情况下帮手?

首先,这是相关的路由信息​​......

stores_study_sites_path GET /stores/study_sites(.:format) stores#study_sites
                        GET /stores/store_details/:id(.:format) stores#store_details

从我的路线文件......

  get 'stores/study_sites' => 'stores#study_sites'
  get 'stores/store_details/:id' => 'stores#store_details'

第一条路线,' study_sites'是一个索引页面,' store_details'是更新页面。

重定向在study_sites页面上呈现为部分...

<% @store.each do |store| %>
  <ul>
    <li>
        <%= store.name %></br>
        <%= store.street %></br>
        <%= store.city %> <%= store.state %></br>
        <%= render "shared/store_details", :store => store %>
    </li>
  </ul>
<% end %>

最后,我想使用的部分,但目前无效...

<%= link_to "Build store profile", stores_study_sites_path(store.id) %>

从此生成的网址看起来像http://localhost:3000/stores/study_sites.26,而我需要它们是http://localhost:3000/stores/store_details/26

我已经完成了许多其他重定向的基本程序,没有任何问题,但我已经创建了这些自定义网址/路由,现在我有点腌菜。在这种情况下,如何指定我希望链接路由到的路径中的哪个URL?

作为一个后续问题(请记住我对Rails真的很新),为什么store_details页面属于stores_study_sites_path?

非常感谢。

3 个答案:

答案 0 :(得分:2)

您可以手动命名路线:

  get 'stores/study_sites' => 'stores#study_sites', as: "first_route"
  get 'stores/store_details/:id' => 'stores#store_details', as: "second_route"

然后使用它们:

<%= link_to "one", first_route_path %>
## this will generate http://localhost:3000/stores/study_sites

<%= link_to "two", second_route_path(5) %>
## this will generate http://localhost:3000/stores/store_details/5

答案 1 :(得分:2)

是RESTful

当开始使用Rails时,尽量避免从带式货车上掉下来 - 大多数现实问题都可以通过标准的CRUD路线和RESTful表示来解决。当您开始为不同的表示创建一堆自定义路线时,质量往往急剧下降。

更好的网址方案是:

/stores                    # index of stores
/stores/1                  # show a single store
/stores/1/details          # index of details of a store.

/stores/1/details就是你所谓的嵌套资源。从URL中可以清楚地看到我们正在寻找属于商店的东西。

您可以使用以下内容声明路线:

resources :stores, shallow: true do
  resources :details
end

然后,您可以使用以下命令创建指向商店详细信息的链接:

<%= link_to "Build store profile", store_details_path(@store) %>

答案 2 :(得分:1)

你真的应该把这个设置within the context of your controller放在路线中:

#config/routes.rb
resources :stores do
   get :study_sites, on: :collection  #-> url.com/stores/study_sites
   get :store_details, on: :member    #-> url.com/stores/:id/store_details
end

...然后在视图中:

<%= link_to "x", stores_store_sites_path %>
<%= link_to "y", stores_store_details_path(store.id) %>