【问题标题】:Rails Routes and excluding default routesRails 路线和不包括默认路线
【发布时间】:2014-08-03 19:09:31
【问题描述】:

我有一个家庭控制器,我打算将其仅用于诸如 aboutus、contactus 或登录页面等页面。将其包含在路由文件中的最佳方法是什么,我根本没有得到默认路由但请务必从站点的根目录以 /[action] 的形式访问每个操作。

例如:

xyz.com/aboutus should take me to home#aboutus
xyz.com/contactus should take me to home#contactus

等等

【问题讨论】:

  • 在路由中使用 'as: path_name' 属性。
  • 你在寻找类似get '/patients/:id', to: 'patients#show'的东西吗?
  • 我认为我的问题措辞不正确。我希望能够让 xyz.com/aboutus 在 home 控制器下显示 aboutus 操作的内容。

标签: ruby-on-rails routes


【解决方案1】:
#config/routes.rb
resources :home, path: "", only: [] do
   collection do
      get :aboutus
      get :contactus
   end
end

循环被@Sanket移除

这将为您的所有页面创建domain.com/aboutus

--

干燥

虽然这是您想要的,但使其工作的更干燥的方法是执行以下操作:

#config/routes.rb
resources :home, path: "", only: :show #-> domain.com/:id

这意味着您可以使用诸如 friendly_id 之类的 gem 为您的页面创建一系列 slug,如下所示:

#app/models/page.rb
class Page < ActiveRecord::Base
    extend FriendlyId
    friendly_id :title, use: [:slugged, :finders]

    #fields
    id | slug | title | body | created_at | updated_at
end

#app/controllers/home_controller.rb
def show
   @page = Page.find params[:id]
end

如果你只想渲染没有模型的页面:

#app/controllers/home_controller.rb
def show
   render "pages##{params[:id]}"
end

这将允许您以最干燥的方式使用 domain.com/home/aboutus 之类的东西

--

警告

对此的一个重要警告是,如果您要使用app-wide slugs,则需要将它们放在routes.rb 文件的底部(这样它们就不会干扰其他路由)

【讨论】:

  • 这是正确的,但你认为它有更多的时间复杂性。
  • 是的,我现在正在写一个更好的方法:)
  • 问题是我不想得到domain.com/home/about。我希望能够转到domain.com/aboutus,这应该会显示关于家庭控制器的 aboutus 操作用户的内容。
  • 我在这里听起来可能完全是个傻瓜,但这对于在后台甚至没有模型的东西来说似乎工作量太大了。我不应该使用match 并以这种方式添加信息吗?
  • 如果您只有静态页面(IE 无模型),我还更新以包含系统
【解决方案2】:

您可以将https://github.com/thoughtbot/high_voltage 用于静态页面。

【讨论】:

  • 这看起来也很有希望,但是如果可以用很少的代码行来实现,为什么还要添加一个 gem。
  • 这个gem对于完成这个任务非常有用和完整。不需要重写代码。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多