Railsチャンピオン
私はかなり長い間、Ruby と Rails 2.x を使用してプログラミングを行ってきました。Rails に精通しているわけではありませんが、フレームワークとツールについてはよく理解していたと言えます。しかし、私は現在、最初の Rails 3 プロジェクト (現在は 3.0.5 を使用) に取り組んでおり、Rails 3 の新しいルーティング インターフェイスにますます必死になっています。
もちろん、私は Ryan Bates の RailsCasts (http://railscasts.com) を全般的にフォローしており、特にこのトピックについてフォローしています。
もちろん、私はこのトピックに関する非常に多くの Web サイトを読みました (例: RailsGuides: Rails Routing from the Outside InまたはThe Lowdown on Routes in Rails 3など...)。
私は本を読む昔ながらの男の 1 人でもあるので、The Pragmatic Programmers による Rails 3 の Beta Book もフォローしています。最後になりましたが、このサイトで適切な答えを見つけようとしました。
質問であなたを悩ませる前に、私は本当に自分の道を見つけようとしたと言うことができると思います. しかし、私の問題を実際にカバーするものは何もないようです。それでも、解決策はそれほど難しくないと確信しています。私は何日も解決策を見つけようとしてきましたが、自分の間違いが何であるかわかりません。
最初に、私がすでにできることを簡単にまとめてみましょう。
次のような、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」がいかに重要であるかを認識していることに注意してください。特定の状況ではそれを省略し、他の状況では追加する必要があることを私は知っています.
誰か助けてくれませんか?私の間違いは何ですか?
助けてくれてどうもありがとう!