Rails3 Engine - Контроллер находится внутри модуля двигателя, возвращая ошибку загрузки клиентским приложением - PullRequest
0 голосов
/ 27 марта 2011

Я только что создал свой первый двигатель.Он добавляет пару новых маршрутов, таких как:

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

Iзагрузил его в консоль клиентского приложения, чтобы доказать, что некоторые основы работают, и быстро получил эту ошибку загрузки (которую я затем подтвердил, воспроизведя проблему в браузере):

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, делает его неузнаваемым.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 27 марта 2011

Ваш app/controllers/contacts_controller.rb фактически определяет Contact::ContactsController, а не ContactsController, который ожидает Rails.

Проблема с вашими маршрутами, они должны быть определены следующим образом:

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
0 голосов
/ 07 апреля 2011

Благодаря @ 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

но последнее, что показалось мне, было предложением @ nathanvda переместить контроллер contacts_controller из:

/app/controllers/contacts_controller.rb

до

/app/controllers/contact/contacts_controller.rb

Спасибо вам обоим за помощь!

...