1

I'm pretty new to rails and I've created a method in posts_controller.rb that contains the following

def update_feeds 
    Post.get_feeds -- works via console 
    @rss_feedsTab = "/admin/posts"
    redirect_to @rss_feedsTab, :notice => 'Feeds Updated successfully'
end 

and trying to make it fire in my view with:

<%= link_to 'Update Feeds', :controller => "posts", :action => "update_feeds", :method=>:post %>

and I get a routing error:

No route matches {:action=>"update_feeds", :method=>:post, :controller=>"admin/posts"}

I'm really not grasping how this whole routing works at all, any help would be appreciated :)

CONTROLLER=posts rake routes:

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
4

2 に答える 2

0

ここで2つのことに注意を払うとよいと思います。

1)コントローラー内のメソッドの名前は、ビューの名前と一致する必要があります。これは、Railsの規則の1つです。たとえば、 (略して)のindexメソッドは、と呼ばれるビューを自動的に検索します。posts_controller.rbposts#indexposts/index.html.erb

2)また、ルートは、コントローラーメソッド(コントローラーアクションとも呼ばれます)に使用する名前を確立します。これらの名前は、HTTP動詞(index、new、create、edit、update、show、destroy)に基づいています。したがって、コントローラーのアクションにもランダムな名前は付けられません。ルートにリストされている既存のアクションの1つから作業することをお勧めします。

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 に答える