0

最初のエンジンを作成しました。次のような新しいルートがいくつか追加されます。

Rails.application.routes.draw do
  scope :module => 'contact' do
    get "contact", :to => 'contacts#new'
    get "contact/send_email", :to => 'contacts#send_email', :as => 'send_email'
  end
end

次に、/websites/Engines/contact/app/controllers/contacts_controller.rb に次のように記述します。

module Contact
  class ContactsController < ApplicationController

    # Unloadable marks your class for reloading between requests
    unloadable

    def new
      @contact_form = Contact::Form.new
    end

    def send_email
      @contact_form = Contact::Form.new(params[:contact_form])

      if @contact_form.valid?
        Notifications.contact(@contact_form).deliver
        redirect_to :back, :notice => 'Thank you! Your email has been sent.'
      else
        render :new
      end
    end
  end
end

クライアントアプリのコンソールにロードして、いくつかの基本が機能していることを証明したところ、すぐにこのロードエラーが発生しました(ブラウザで問題を再現して確認しました):

ruby-1.8.7-p302 > Contact::Form.new
 => #<Contact::Form:0x2195b70> 
ruby-1.8.7-p302 > app.contact_path
 => "/contact" 
ruby-1.8.7-p302 > r = Rails.application.routes; r.recognize_path(app.contact_path)
LoadError: Expected /websites/Engines/contact/app/controllers/contacts_controller.rb to define ContactsController

そして、あなたはそれを持っています。/contact はエンジンのcontacts_controller.rbに到達しますが、コントローラがモジュール Contact 内にあるという事実により認識できなくなります。

私は何を間違っていますか?

4

2 に答える 2

4

Railsが期待するではなく、app/controllers/contacts_controller.rb実際に を定義しています。Contact::ContactsControllerContactsController

問題はルートにあります。ルートは次のように定義する必要があります。

Rails.application.routes.draw do
  scope :module => 'contact' do
    get "contact", :to => 'contact/contacts#new'
    get "contact/send_email", :to => 'contact/contacts#send_email', :as => 'send_email'
  end
end
于 2011-03-26T22:19:26.123 に答える
0

@ryan-bigg と @nathanvda のおかげで、彼らの回答を組み合わせてこの問題を解決できました。要するに、次のルートを使用することになりました。

Rails.application.routes.draw do
  scope :module => 'contact' do
    get  "contact", :to => 'contacts#new'
    post "contact/send_email", :to => 'contacts#send_email', :as => 'send_email'
  end
end

次のコントローラーを使用します。

module Contact
  class ContactsController < ApplicationController

    def new
      @contact_form = Contact::Form.new
    end

    def send_email
      @contact_form = Contact::Form.new(params[:contact_form])

      if @contact_form.valid?
        Contact::Mailer.contact_us(@contact_form).deliver
        redirect_to :back, :notice => 'Thank you! Your email has been sent.'
      else
        render :new
      end
    end

  end
end

しかし、最後のピースのように見えたのは、contacts_controller を移動するという @nathanvda の提案でした。

/app/controllers/contacts_controller.rb

/app/controllers/contact/contacts_controller.rb

助けてくれてありがとう!

于 2011-04-07T19:08:20.157 に答える