路由问题导轨

时间:2013-01-27 01:41:55

标签: ruby-on-rails-3

我对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"}

我真的没有理解整个路由的工作方式,任何帮助都会受到赞赏:)

CONTROLLER =发布佣金路线:

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}}

的routes.rb

namespace :admin do

   resources :users,:videos,:posts,:links,:rss_feeds

   resources :posts, :collection => {:update_feeds => :post}

end

2 个答案:

答案 0 :(得分:0)

我认为你最好在这里注意两件事:

1)控制器中方法的名称必须与视图名称匹配。这是Rails的惯例之一。例如,index(简称posts_controller.rb)中的posts#index方法会自动查找名为posts/index.html.erb的视图。

2)此外,您的路由会确定您应该为控制器方法使用的名称(也称为控制器操作)。这些名称基于HTTP谓词(索引,新建,创建,编辑,更新,显示,销毁)。因此,控制器操作也不是随机命名的。我建议您使用路线中列出的现有操作之一。

Rails确实允许您使用所需的名称轻松创建自己的操作,但您可能应该首先使用约定,然后尝试开始自定义事物。

您获得的特定错误消息表示没有与您刚刚创建的控制器操作相关联的路由。正如我所说,创建控制器操作涉及创建相关的视图和路径 - 这就是为什么我不鼓励你这样做。从路线开始,看看你有哪些,然后去那里。

答案 1 :(得分:0)

路由将URL路径与控制器操作相匹配。逻辑如下:

  1. 用户导航至http://your.domain.com/some/path
  2. 您的routes.rbget '/some/path', to: posts#update_feeds
  3. 由于用户导航到/ some / path,因此会执行PostsController中的update_feeds操作。
  4. 控制器操作通常会将用户重定向到另一个路径(或域外部的URL),或呈现某些内容。
  5. 您遇到的问题是link_to需要链接到网址或路径,即与href代码的a值有关的内容。 Rails有时会为您提供路线助手,这只是一种便利。它们允许您说出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 %>