23

追加機能を含むいくつかのエンジンを備えた Rails 3 アプリケーションがあります。各エンジンは、顧客がアクセス権を購入できる個別のサービスです。

ただし、コントローラーとビューですぐに利用できないエンジンからのルートに問題があります。

コントローラ:

class ClassroomsController < ApplicationController
  ..
  respond_to :html

  def index
    respond_with(@classrooms = @company.classrooms.all)
  end

  def new
     respond_with(@classroom = @company.classrooms.build)
  end

  ..
end

app/views/classrooms/new.html.haml:

= form_for @classroom do |f|
  ..
  f.submit

config/routes.rbエンジン内:

MyEngineName::Engine.routes.draw do
  resources :classrooms
end

config/routes.rbアプリ内:

Seabed::Application.routes.draw do
  mount MyEngineName::Engine => '/engine'
  ...
end

lib/my_engine_name.rbエンジン内:

module MyEngineName
  class Engine < ::Rails::Engine
  end
end

に行こうとすると/classrooms/new

NoMethodError in Classrooms#new

Showing app/views/classrooms/_form.html.haml where line #1 raised:
  undefined method `hash_for_classrooms_path' for #<Module:0x00000104cff0f8>

classrooms_path他のビューから呼び出そうとすると、同じエラーが発生します。ただし、呼び出しMyEngineName::Engine.routes.url_helpers.classrooms_pathて機能させることはできます。ルートを間違って定義したのではないかと考えていますが、別の方法が見つかりません。

Passenger (スタンドアロンおよび Apache モジュール) と WEBrick (rails サーバー) の両方でアプリを実行してみました。Git から最新の Rails を使用する ( 7c920631ec3b314cfaa3a60d265de40cba3e8135)。

4

3 に答える 3

26

私は同じ問題を抱えていて、ドキュメントでこれを見つけました:

アプリケーションのルート内にエンジンをマウントできるようになったため、アプリケーション内のエンジンの url_helpers に直接アクセスすることはできません。アプリケーションのルートにエンジンをマウントすると、それを可能にする特別なヘルパーが作成されます。そのようなシナリオを考えてみましょう:

# config/routes.rb
MyApplication::Application.routes.draw do
  mount MyEngine::Engine => "/my_engine", :as => "my_engine"
  get "/foo" => "foo#index"
end

これで、アプリケーション内で my_engine ヘルパーを使用できます。

class FooController < ApplicationController
  def index
    my_engine.root_url #=> /my_engine/
  end
end
于 2012-09-06T06:26:17.283 に答える
25

エンジンを次のように変更config.routesします。

Rails.application.routes.draw do  # NOT MyEngineName::Engine.routes.draw
  resources :classrooms
end

あなたがそれを持っている方法では、ルートは名前空間でのみ利用可能でMyEngineName::Engineあり、ホストレールアプリケーションの残りの部分では利用できません。

以前はより多くの情報が記載されたブログ投稿がありましたが、残念ながら現在は利用できません。

于 2010-12-06T00:15:11.980 に答える
2

私も追加するのを手伝ってください

require 'engine' if defined?(Rails)

メインの gem ファイル (lib/.rb) に追加します。

良い例 - https://github.com/mankind/Rails-3-engine-example/blob/master/lib/dummy.rb

于 2011-10-10T17:05:08.730 に答える