Rails 2.3ではnamedspacedルーティングが変更されましたか?
-
05-07-2019 - |
質問
admin_projectsやadmin_projectなどの通常のルートを提供するadmin名前空間がありますが、通常の方法では動作しません。これは私の最初のRails 2.3プロジェクトですので、関連するかもしれませんが、Google経由で情報を見つけることはできません。
map.namespace(:admin) do |admin|
admin.resources :projects
end
奇妙なのは、指定されたURL(たとえば/ admin / projects / 1)の場合です。URLを取得するためにオブジェクトを渡す必要はありません。
<%= admin_project_path %> # => /admin/projects/1
心配する必要はありません。これは以前は気づかなかった問題です。
しかし、いつものようにオブジェクトを渡そうとした場合:
<%= admin_project_path(@project) %> # => admin_project_url failed to generate from {:controller=>"admin/projects", :action=>"show", :id=>#<Project id: 1, name: "teamc...>
&quot;:id&quot;オブジェクト全体が含まれているようですので、IDを直接渡してみて、動作します:
<%= admin_project_path(@project.id) %> # => /admin/projects/1
これはそれほど悪いことではありませんが、フォームに関しては通常[:admin、@object]を使用しますが、
<%= url_for [:admin, @project.id] %> # => undefined method `admin_fixnum_path'
したがって、使用する正しいルートを決定するためにオブジェクトクラスが必要なので、idを渡すことはできません。
<%= url_for [:admin, @project] %> # => Unfortunately this yields the same error as passing a object to admin_project_path, which is what it is calling.
間違いを見つけることはできません。これはかなり標準的なことなので、何が間違っているのかわかりません...
解決
興味深い。 Projectで to_param
メソッドを定義するとどうなりますか?たとえば
class Project < ActiveRecord::Base
def to_param
self.id
end
end
これはデフォルトである必要があり、必要ではありません。しかし、明示的にするとどうなりますか?上記のメソッドを追加してから、@ projectのみを渡すという元のアプローチに戻ってみてください
他のヒント
この件についてお役に立てれば幸いです。名前空間セクションがいくつかある大規模なアプリケーションがあります。ルートは、説明したとおりの方法で定義され、オブジェクトを使用してパスヘルパーを呼び出しています。 IDを使用してアプリケーションのどこにアクセスしますか。
アプリケーションはRails 2.1で開始され、ルーティングに大きな変更はなく2.2および2.3に移行しました。申し訳ありませんが、これ以上サポートすることができませんでした。
ピア