2

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

正如您可能已经猜到的那样,在调用集合而不是member上的方法时,我丢失了“id”参数。请注意,我知道“项目”末尾的“s”有多重要。我知道您需要在某些情况下将其排除在外,并在其他情况下将其添加。

有谁可以帮我离开这里吗?我的错误是什么?

非常感谢你的帮助!

4

2 回答 2

0
<% form_tag (my_method_item_path(@item), :class => :some_css_class, :method => :post ) do %>
    ...
<% end %>
于 2011-03-21T17:00:19.623 回答
-1

访问此 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 的照片控制器的预览方法

于 2011-03-28T06:31:40.403 回答