2

Railsルーターとフォームジェネレーターに少し問題があります。私のアプリケーションには、モデルとコントローラーの名前空間モジュールがあります。モジュールは、別のプロジェクトへの抽象化を容易にするために使用されます。

routes.rb「醜い」パスヘルパーがないため、名前空間の代わりにスコープメソッドを使用しています。

次のようになります。

scope module: :taxonomy do
  resources :taxonomies do
    resources :terms
  end
end

問題は、分類法(u​​rl :)を編集したいときtaxonomies/1/editに、エラーが発生することです。

undefined method `taxonomy_taxonomy_path'

私のルートは代わりにtaxonomy_path

form_for @taxonomyそのルートがスコープされていることを認識するためのリーチ方法はありますか?未使用form_for @taxonomy, url: taxonomy_path(@taxonomy)で硬化しません。内のコントローラーメソッドの@taxonomyオブジェクトは、respond_with @taxonomy常にtaxonomy_taxonomy_url

私のモデル:

module Taxonomy
  class Taxonomy < ActiveRecord::Base
    has_many :taxonomy_terms, inverse_of: :taxonomy
    has_many :terms, through: :taxonomy_terms
  class Term < ActiveRecord::Base
    has_one :taxonomy_term, inverse_of: :term
    has_one :taxonomy, through: :taxonomy_term

およびコントローラー:

module Taxonomy
  class TaxonomiesController < ApplicationController
4

3 に答える 3

4

ActiveRecordのモデルの命名は、次の方法でオーバーライドできます。

module Taxonomy
  class Taxonomy < ActiveRecord::Base
    def self.model_name
      ActiveModel::Name.new("Taxonomy")
    end
  end
end

これは、Taxonomyモジュールの下にあるため、Taxonomyクラスのtaxonomy_taxonomy名を生成するActiveRecordのデフォルトの命名生成をオーバーライドします。ルーティング名の問題を解決し、必要に応じて適切なルート名を生成する必要があります。

于 2012-08-07T10:26:38.783 に答える
3

これをroutes.rbで試してください:

namespace :taxonomy do
  resources :taxonomies do
    resources :terms
  end
end

これには、おそらく、コントローラーを同じ名前のサブディレクトリに保存する必要がありますtaxonomy

于 2012-08-07T10:25:47.963 に答える
2

フォルダ構造のため、クラスにモジュールを追加する必要があると確信しています。

  app/models
  ├── ...
  ├── taxonomy
  │   ├── taxonomy.rb
  │   └── ...
  └── ...

レールを構成して、サブフォルダーにあるモデルを再帰的にロードできます。

構成するconfig/application.rb

config.autoload_paths += Dir[ Rails.root.join('app', 'models', "taxonomy", '**/') ]

この構成は、Railsアプリの任意のフォルダーとサブフォルダーに設定できます。


そうすれば、ActiveRecordのモデルをオーバーライドする必要はありませんが、これが常に最良のアイデアであるとは限りません。

class Taxonomy < ActiveRecord::Base
  ...
end
于 2018-08-08T10:25:45.550 に答える