我正在尝试按照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中找到任何帮助。
有人可以帮忙吗?
答案 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)