【问题标题】:"No route matches" error in Rails 3 when invoking own controller method from view (POST)从视图(POST)调用自己的控制器方法时,Rails 3 中出现“无路由匹配”错误
【发布时间】:2011-07-19 20:02:54
【问题描述】:

Rails 冠军

我用 Ruby 和 Rails 2.x 编程已经有一段时间了,虽然我肯定不精通 Rails,但我仍然会说我很好地掌握了框架和工具。但是,我目前正在处理我的第一个 Rails 3 项目(目前使用 3.0.5),并且我对新的 Rails 3 路由接口越来越绝望。

当然,我一直在关注 Ryan Bates 的 RailsCasts (http://railscasts.com),特别关注这个主题。
当然,我已经阅读了很多很多关于该主题的网站(例如RailsGuides: Rails Routing from the Outside InThe Lowdown on Routes in Rails 3 等,等等...)。
我什至是那些读书的老派之一,所以我也一直在关注 The Pragmatic Programmers 的 Beta Book on Rails 3。 最后但并非最不重要的一点是,我确实尝试在这个网站上找到合适的答案。

我想你可以说,在用我的问题纠缠你之前,我真的很想找到自己的路。但似乎没有什么能真正解决我的问题。然而,我很确定,解决方案不会太难。几天来我一直在努力寻找解决方案,但我只是不明白我的错误是什么。

首先让我简要介绍一下我已经可以做什么:

我对 routes.rb 中的条目预定义的标准 Rails 方法没有任何问题,例如:

resources :my_controller

我还设法让一些自己的 GET 方法发挥作用,例如:

# in routes.rb
resources :some_items do
  get :my_additional_method, :on => :member
end

# in a view of SomeItemController:
<%= link_to 'invoke additional method', [:my_additional_method, @some_item], :class => "some_css_class" %>

但是,下面的情况让我很头疼:

# in ItemController
def my_method
  raise params.to_yaml
end

# in routes.rb
resources :items do
  post :my_method, :on => :member
end

# e.g. in edit view of ItemController:
<% form_tag ( my_method_item_path(@item), {:class => :some_css_class} ) do %>
...
<% end %>

# 'rake routes' output excerpt
my_method_item POST /items/:id/my_method(.:format) {:controller =>"items", :action=>"my_method"}

# ERROR during the rendering of the view
No route matches {:action=>"my_method", :controller=>"items", :id=>#<Item id: ...>}

我尝试了上述的几十种变体。 例如,以下变体没有帮助

# variation of form_tag in view:
<% form_tag ( {:controller => "items", :action => "my_method", :id => @item }, {:class => :some_css_class} ) do %>

我得到的唯一工作 - 然而,这不是我想要的 - 如下:

# in ItemController
def my_method
  raise params.to_yaml
end

# in routes.rb
resources :items do
  post :my_method, :on => :collection
end

# e.g. in edit view of ItemController:
<% form_tag ( my_method_items_path(@item), {:class => :some_css_class} ) do %>
...
<% end %>

# 'rake routes' output excerpt
my_method_items POST /items/my_method(.:format) {:controller =>"items", :action=>"my_method"}

您可能已经猜到了,在调用 collection 而不是 member 上的方法时,我丢失了“id”参数。 请注意,我知道“项目”末尾的“s”有多重要。我知道您需要在某些情况下忽略它,而在其他情况下添加它。

有人可以帮我吗? 我的错误是什么?

非常感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails-3 controller routes http-post custom-routes


    【解决方案1】:
    <% form_tag (my_method_item_path(@item), :class => :some_css_class, :method => :post ) do %>
        ...
    <% end %>
    

    【讨论】:

    • 嗨 Shiv,感谢您的回答。不过,它并没有解决我的问题。我不需要form_for。我真的需要form_tag。除此之外,我的问题是,虽然“my_method_item_path”被正确转换为 {:controller => 'items', :action => 'my_method'} 没有匹配它的路线,我不知道如何调整我的路由。无论如何,Tx。
    • 我已经使用 form_tag 修改了我的回复,这应该适合你
    【解决方案2】:

    访问此 URL 以了解如何将更多 RESTful 操作添加到“资源”d 控制器:

    http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

    resources :photos do
      member do
        get 'preview'
      end
    end
    

    添加以下示例方法路由:

    /photos/1/preview 
    

    这将调用 ID 为 1 的照片控制器的预览方法

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      相关资源
      最近更新 更多