1

我对 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=发布 rake 路线:

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
4

2 回答 2

0

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

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

2)此外,您的路线确定您应该为控制器方法(也称为控制器操作)使用哪些名称。这些名称基于 HTTP 动词(index、new、create、edit、update、show、destroy)。因此,控制器动作也不是随机命名的。我建议您从路线中列出的现有操作之一开始工作。

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

您收到的特定错误消息意味着没有与您刚刚创建的控制器操作关联的路由。正如我所说,创建控制器操作涉及创建关联的视图和路由——这就是为什么我现在不鼓励你这样做。从路线开始,看看你有哪些路线,然后从那里出发。

于 2013-01-27T02:48:37.337 回答
0

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

  1. 用户导航到http://your.domain.com/some/path
  2. routes.rb话里有话get '/some/path', to: posts#update_feeds
  3. 因为用户导航到 /some/path,所以 PostsController 中的 update_feeds 操作被执行。
  4. 控制器操作通常要么将用户重定向到另一个路径(或域外部的 URL),要么呈现一些内容。

您遇到的问题是您需要链接到 URL 或路径,即作为标记值link_to有意义的东西。Rails 有时会为您提供路线助手,这只是一种方便。它们允许您说出类似而不是. 在您的中,您的操作似乎没有一个命名良好的路径。hrefaadmin_post_path(3)/admins/post/3rake routesupdate_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 %>
于 2013-01-27T02:54:06.757 回答