我的半静态页面的路由问题

时间:2014-02-28 11:06:52

标签: ruby-on-rails ruby-on-rails-4 routing rails-routing

我正在尝试按照railscast

实现半静态页面

起初我将我的班级命名为“关于”,但这引发了以下错误:

无效的路线名称,已在使用中:'page'(ArgumentError) 您可能使用:as选项定义了两个具有相同名称的路由,或者您可能正在覆盖已由具有相同命名的资源定义的路由。

经过一些谷歌搜索后,似乎因为某些原因它与active_admin冲突,所以我将表重命名为'Page',并且我已经仔细地将所有相应的文件,类和方法等从'关于'重命名为'页“

This is my Page model:

    class Page < ActiveRecord::Base

      validates_uniqueness_of :url

      def to_param
        url
      end   

    end

And these are my routes:

  get 'signup', to: 'users#new', as: 'signup'
  get 'login', to: 'sessions#new', as: 'login'
  get 'logout', to: 'sessions#destroy', as: 'logout'

  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)
  resources :users 
  resources :sessions
  resources :password_resets
  resources :posts do 
    resources :comments
    resources :votes, only: [:new, :create]
    resources :flags, only: [:new, :create]
  end
  resources :comments do 
    resources :comments
    resources :votes, only: [:new, :create]
    resources :flags, only: [:new, :create]
  end
  resources :newsletters
  resources :pages, except: :show
  resources :subscribers, only: [:index, :new, :create] 
  # resources :prelaunch
  # get 'about', to: 'prelaunch#about'
  root to: 'posts#index' 
  get ':id', to: 'pages#show', as: :page  

我仍然遇到与上述相同的错误。

我能让它完成一半工作的唯一方法是删除'as :: page'位,这会停止冲突,并硬编码我想指向代码的网址,例如

<%= link_to page.name, "localhost:3000/#{page.url}" %>

这远非理想。

我无法在Outside In中找到任何帮助。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

以下是修复:

#config/routes.rb
resources :pages, except: :show

(删除get ':id', to: 'pages#show', as: :page

这将创建标准RESTful routes,它将创建一个路由结构,除了 show action


<强>蛞蝓

How to create app-wide slug routing for Rails app?

如果您想拥有/about等,则必须专门生成它们:

#config/routes.rb
if Page.all.any?
    Page.all.each do |page|
       get page, to: "pages#show", id: page.id
    end
end

这也可以使用friendly_id

来处理

答案 1 :(得分:1)

好的,经过大量的黑客攻击和Rich Peck的有用指针,我得到了一个有效的解决方案。

路线:

  resources :pages, except: :show
  if Page.all.any?
    Page.all.each do |page|
       get "#{page.url}", to: "pages#show", as: "#{page.url}", id: page.id
      end
  end

控制器:

  def show
    @page = Page.find(params[:id])
  end

注意,我已经按照建议使用了friendly_id gem。

动态生成链接:

应用程序控制器:

  def about_us
    @pages = Page.all
  end
  helper_method :about_us

页面助手:

def about_link(page)
    link_to page.name, "/#{page.url}"
end

注意: - 您需要包含/否则它会尝试为您所在的页面添加控制器的名称(我不知道为什么)。

我的页脚:

<% about_us.each do | page | %>
<%= about_link(page) %>
<% end %>

更新:

我在将我的应用程序部署到Heroku时遇到了很多麻烦,我相信这是因为页面路径。

我现在改为更简单的解决方案:

  resources :pages, path: ""

问题已经消失了。

答案 2 :(得分:1)

您是否考虑使用“为您工作”的宝石?我一直在使用https://github.com/thoughtbot/high_voltage gem来为我处理静态页面,没有任何麻烦。它负责路由和控制器,只将页面的创建保留在专用的视图/页面文件夹中。链接到静态页面就像创建指向page_path的链接一样简单(:name_of_the_page)