16

Rails では、モジュール内のモデルに名前を付けてから正しい動作を取得することは可能url_forですか?

たとえば、ここでurl_forは期待どおりに動作します。

# app/models/user.rb
class User < ActiveRecord::Base
end

# config/routes.rb
resources :users

# app/views/users/index.html.haml
= url_for(@user)    # /users/1

Userモデルをモジュールに入れた後url_for、未定義のメソッドについて不平を言うm_user_path

# app/models/m/user.rb
module M
  class User < ActiveRecord::Base
  end
end

# config/routes.rb
resources :users

# app/views/users/index.html.haml
= url_for(@user)    # undefined method 'm_users_path'

url_forモジュールを無視して代わりにM::User返すことは可能ですか?user_pathurl_for(@user)m_user_path

アップデート

それで、ほぼ5年後、esadのおかげで解決策がここにあります. これは Rails 4.2 でテスト済みです。

# app/models/m/user.rb
module M
  class User < ActiveRecord::Base
  end
end

# app/models/m.rb
module M
  def self.use_relative_model_naming?
    true
  end
  def self.table_name_prefix
    'm_'
  end
end

# config/routes.rb
resources :users

# app/views/users/index.html.haml
= url_for(@user)    # /users/1

注: を使用してモデル、ビュー、およびコントローラーを生成する場合、ビューとbin/rails g scaffold m/userコントローラーにも名前空間が付けられます。app/views/m/usersに移動する必要がapp/views/usersありapp/controllers/m/users_controller.rbますapp/controllers/users_controller.rbMまた、モデル以外のすべてのモジュールへの参照を削除する必要がありますM::User

最後に、ここでの目標は名前空間モデルであり、ビューとコントローラーではありません。esads ソリューションでは、モジュールM(を含むUser) はルートに表示されないように明示的に指示されます。したがって、事実上、Mは取り除かれ、User残るだけになります。

ユーザーモデルは に常駐できapp/views/models/m/user.rb、ユーザーコントローラーは にapp/views/controllers/users_controller.rbあり、ビューは にありますapp/views/users

4

4 に答える 4

28

use_relative_model_naming?含まれるモジュールで定義するだけで、生成されたルート名のプレフィックスを回避できます。

module M
  def self.use_relative_model_naming?
    true
  end
end
于 2012-11-22T22:42:24.787 に答える
4

使用する

namespace "blah" do
  resources :thing
end

その後、ルートに適切な名前が付けられます。

rake routes

すべてのルートを表示するには

于 2010-12-10T00:08:03.600 に答える
3

ルート上のモジュールを指定します

resources :users, :module => "m"

またはスコープを使用してそれを行う

scope :module => "m" do
  resources :users
end
于 2011-01-04T12:42:04.090 に答える
0

私の場合、application_helper.rb ファイルの url_for メソッドをオーバーライドして、名前空間 :mkp からのすべてのルートに :network パラメータを追加しました。

module ApplicationHelper
  def url_for(options = {})
    if options.is_a?(Hash) && options.has_key?(:controller)
      if options[:network].nil? && options[:controller].match(/^mkp\//).present?
        options[:network] = @network.downcase
      end
    end
    super(options)
  end
end
于 2013-03-27T21:44:54.957 に答える