【问题标题】:Routing Problems Rails路由问题 Rails
【发布时间】:2013-01-27 13:18:32
【问题描述】:

我对 Rails 很陌生,我已经创建了一个方法 post_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}}

routes.rb

namespace :admin do

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

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

end

【问题讨论】:

  • 您能发布您的routes.rbrake routes 的输出吗?
  • 用该信息更新了主帖:)

标签: ruby-on-rails-3


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 看起来 OP 想要页面上的按钮/链接触发副作用(服务器端提要刷新)并重定向回主页。应该为此使用哪个现有操作?
  • 据我所知,如果我们正在查看帖子列表,它可能会进入索引操作。但我不确定我是否对这种数据结构感到满意。如果我们要更新提要,那么为什么我们没有提要模型而不是帖子模型?
  • 我所做的是创建了一个提要模型,其中包含要从中获取提要的 URL 列表,我在帖子页面上触发它的原因是我想要一个按钮单击后,只需循环浏览提要并将所有这些条目添加到数据库中,然后将您返回到帖子页面以查看所有新帖子。也就是说,我通常习惯于通过 js 和 html 来做大多数这样的事情,而且对 rails 还很陌生,不太确定我是否掌握了如何触发这样的功能。
  • 您是如何最终编写您所说的在控制台中工作的 get_feeds 方法的?你在看教程吗?你看过关于 Feed Parsing 的 Railscasts 集吗? railscasts.com/episodes/168-feed-parsing
  • 是的,我做了那个教程,然后修改它以从另一个模型中获取 rss url 列表,这部分工作得很好,我可以从终端触发它没问题,它填充了我的数据库来自所有 RSS 提要的帖子,但我不希望它更新 cron 或类似的提要。基本上我想要一个按钮,当点击更新提要时,我'
【解决方案2】:

路由将 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),要么呈现一些内容。

您遇到的问题是您的 link_to 需要链接到 URL 或路径,即作为 a 标记的 href 值有意义的东西。 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 %>

【讨论】:

  • 我没有忽略您的回复 :) 我一直在玩弄一些东西,并试图掌握它足以回复并知道我在看什么:P
  • 查看编辑后的版本,它更适合您在 routes.rb 中已经在做的事情。
  • 好吧,我实际上认为我刚刚开始工作了。我创建了一个名为 feeds_controller.rb 的控制器,并在 def 索引中放置了我的函数、重定向等。然后将 :feeds 添加到我的 routes.rb 中,一切都按我的预期工作。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多