【问题标题】:Same url format in different controllers with ruby on railsruby on rails 在不同的控制器中使用相同的 url 格式
【发布时间】:2019-09-21 13:13:17
【问题描述】:

我在使用 ruby​​ on rails 进行路由时遇到困难。我在不同的控制器中具有相同的 url 格式,我试图将参数发送到site controller,但它改为发送到pages controller。有什么帮助吗?

Route.rb

resources :sites, :path => '', :except => [:index] do
  resources :pages, :path => '' do
  end
end

当我运行 rails routes 命令时,我得到的结果如下:

site_pages GET    /:site_id(.:format)            pages#index
site GET          /:id(.:format)                 sites#show

查看

<%= link_to 'GO', site_path(site) %>

这段代码应该转到site#show,但它转到pages#index,它在下面给我这个错误消息:

 NoMethodError in PagesController#index 
 undefined method `site_id' for nil:NilClass

 Parameters:
 {"site_id"=>"site A"}

我试过了:

<%= link_to '', site_path(site), :controller => "sites", :action => "show"%>

<%= link_to '', site_path(id: site.id)%>

但它不起作用。任何帮助将不胜感激

【问题讨论】:

  • /:site_id/:id 从路由的角度来看是无法区分的。因此,您认为 应该解析为sites#show 的任何内容都(正确)解析为pages#index

标签: ruby-on-rails url routes


【解决方案1】:

除了@jvillian 的评论之外,您的路线不起作用。

假设用户想查看带有id 1 的网站。她可以输入网址my_domain.com/1。现在,她想查看该站点的页面,因此她输入了my_domain.com/1。 Rails 怎么知道她指的是什么?

【讨论】:

    【解决方案2】:

    由于页面嵌套在网站内,您(通常)需要有一个网站才能拥有页面。要在您的方案中完成此操作,请从页面资源中删除 :path => ''。这将为您提供如下所示的路线:

    site_pages GET    /:site_id/pages(.:format)          pages#index
    site       GET    /:id(.:format)                     sites#show
    

    然后,您需要在任何时候想要访问/创建其页面时都有一个站点 ID。但是请记住,如果您通过类似mydomain.com/anything_here 的路线,您将被定向到sites#show 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多