我对rails很陌生,我已经创建了一个方法包含以下内容的 posts_controller.rb
def update_feeds
Post.get_feeds -- works via console
@rss_feedsTab = "/admin/posts"
redirect_to @rss_feedsTab, :notice => 'Feeds Updated successfully'
end
并试图用以下方法让它火起来:
<%= link_to 'Update Feeds', :controller => "posts", :action => "update_feeds", :method=>:post %>
我收到路由错误:
No route matches {:action=>"update_feeds", :method=>:post, :controller=>"admin/posts"}
我真的根本不了解整个路由是如何工作的,任何帮助将不胜感激:)
控制器=帖子耙子路由:
admin_post GET /admin/posts/:id(.:format) admin/posts#show
PUT /admin/posts/:id(.:format) admin/posts#update
DELETE /admin/posts/:id(.:format) admin/posts#destroy
GET /admin/posts(.:format) admin/posts#index {:collection=>{:update_feeds=>:post}}
POST /admin/posts(.:format) admin/posts#create {:collection=>{:update_feeds=>:post}}
GET /admin/posts/new(.:format) admin/posts#new {:collection=>{:update_feeds=>:post}}
GET /admin/posts/:id/edit(.:format) admin/posts#edit {:collection=>{:update_feeds=>:post}}
GET /admin/posts/:id(.:format) admin/posts#show {:collection=>{:update_feeds=>:post}}
PUT /admin/posts/:id(.:format) admin/posts#update {:collection=>{:update_feeds=>:post}}
DELETE /admin/posts/:id(.:format) admin/posts#destroy {:collection=>{:update_feeds=>:post}}
路线.rb
namespace :admin do
resources :users,:videos,:posts,:links,:rss_feeds
resources :posts, :collection => {:update_feeds => :post}
end
我认为您最好在这里注意两件事:
1) 控制器中的方法名称必须与视图的名称匹配。这是Rails的惯例之一。例如,posts_controller.rb
(简称posts#index
)中的index
方法将自动查找名为 posts/index.html.erb
的视图。
2) 此外,路由确定应将哪些名称用于控制器方法(也称为控制器操作)。这些名称基于 HTTP 动词(索引、新建、创建、编辑、更新、显示、销毁)。因此,控制器操作也不是随机命名的。我建议您从路由中列出的现有操作之一开始工作。
Rails 确实允许您使用所需的名称轻松创建自己的操作,但您可能应该先按照约定进行操作,然后才尝试开始自定义内容。
您收到的特定错误消息意味着没有与您刚刚创建的控制器操作关联的路由。正如我所说,创建控制器操作涉及创建关联的视图和路由 - 这就是为什么我不鼓励你此时这样做。从路线开始,看看你有哪些路线,然后从那里开始。
路由将 URL 路径与控制器操作匹配。 逻辑如下:
- 用户导航到 http://your.domain.com/some/path
- 你
routes.rb
里有话说get '/some/path', to: posts#update_feeds
- 由于用户导航到/some/path,因此 PostsController 中的update_feeds操作将被执行。
- 控制器操作通常会将用户重定向到另一个路径(或域外部的 URL),或者呈现某些内容。
您遇到的问题是您的link_to
需要链接到 URL 或路径,即作为 a
标签的href
值有意义的内容。 轨道有时会为您提供路线助手,这只是一种方便。 他们允许您说诸如admin_post_path(3)
而不是/admins/post/3
之类的话。 在您的rake routes
中,您似乎没有一个命名良好的路径来命名update_feeds
操作。
将routes.rb
更改为以下内容:
resources :posts do
collection do
post :update_feeds
end
end
这会将/posts/update_feeds 路由到相应的控制器和操作,并为您提供路由帮助程序,以便您可以将link_to
更改为:
<%= link_to 'Update Feeds', update_feeds_posts_path, method: :post %>