Контроллер и модели пространства имен Rails::Engine

Я следовал следующему руководству: http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/

И все отлично работает. Я назвал контроллер с помощью

#app/controller/authr/accounts_controller.rb

module Authr
  class AccountsController < ApplicationController
    unloadable

    def new
      @account = Account.new
    end

    def create
      @account = Account.new(params[:account])
      if @account.save
        redirect_to '/'
      else
        render :action => :new
      end
    end
  end
end

И в учебнике он не использовал пространство имен для модели. Я хочу создать пространство имен для своей модели, чтобы она не конфликтовала с хост-приложениями. Итак, я попробовал следующее:

#app/models/authr/account.rb
module Authr
    class Account < ActiveRecord::Base
        attr_accessor :password
        validates_confirmation_of :password
    end
end

Это мое мнение, с простой формой form_for, которая должна перейти к account_path

#app/views/authr/accounts/new.html.erb
<%= form_for(@account) do |f|%>
    <p>
        <%= f.label :uname, "Username"%>
        <%= f.text_field :uname%>
    </p>
    <p>
        <%= f.label :password, 'Password'%>
        <%= f.password_field :password%>
    </p>
    <p>
        <%= f.submit "Submit"%>
    </p>
<% end %>

Но когда я использую свою модель с пространством имен, я получаю следующую ошибку:

undefined method `authr_accounts_path' for #<#<class:0x1038f54e0>:0x1038f3780>

Объект, созданный новым методом (@account = Account.new), приводит к следующему результату:

<Authr::Account id: nil, uname: nil, hashed_password: nil, remember_token: nil, remember_expiry: nil, created_at: nil, updated_at: nil>

Файл маршрутов: (Это работает, когда я не использую пространство имен модели.)

Rails.application.routes.draw do |map|
    resources :accounts,  :only => [:new, :create],
                           :controller => "authr/accounts"
end

Так что это дело маршрутизации. Когда я не использую пространство имен, модель работает нормально, но когда я использую пространство имен, она не работает. Затем я попробовал следующее:

#routes.rb
Rails.application.routes.draw do |map|
  scope "authr", :module => :authr, :as => "authr" do
    resources :accounts
  end
end

Теперь я получаю форму без ошибки маршрутизации. Но когда я пытаюсь отправить форму, объект не сохраняется.

Started POST "/authr/accounts" for 127.0.0.1 at Mon Mar 28 18:51:12 +0200 2011
  Processing by Authr::AccountsController#create as HTML
  Parameters: {"commit"=>"Submit", "authenticity_token"=>"cPH8ZmNmgoT84UMnYBoM38di+/OZQmuGQTrSv3HhFR4=", "utf8"=>"✓", "authr_account"=>{"uname"=>"usrrrrrrrrrrrrnmmmmeee", "password"=>"[FILTERED]"}}
  SQL (48.0ms)  BEGIN
  SQL (0.5ms)  SHOW TABLES
  SQL (13.2ms)  describe `accounts`
  AREL (0.3ms)  INSERT INTO `accounts` (`updated_at`, `created_at`, `remember_expiry`, `uname`, `remember_token`, `hashed_password`) VALUES ('2011-03-28 16:51:12', '2011-03-28 16:51:12', NULL, NULL, NULL, NULL)
  SQL (0.4ms)  COMMIT
Redirected to http://localhost:3000/

Я знаю, что я делаю @account = Account.new(params[:account]), и если я изменю его на Account.new(params[:authr_account], то я должен работать, но я хочу, чтобы параметры пользователя[:account] должно работать правильно?Потому что контроллер также имеет пространство имен...

Затем я нашел кое-что о пространстве изолированных имен, поэтому я попробовал это:

#lib/authr/engine.rb
  require "authr"
  require "rails"

module Authr
  class Engine < Rails::Engine
    isolate_namespace Authr
    # engine_name :authr #deprecated?
  end
end

и я изменил свои маршруты на:

Rails.application.routes.draw do |map|
    resources :accounts,  :only => [:new, :create],
                          :controller => "authr/accounts"
end

Но это дает мне следующую ошибку:

/Library/Ruby/Gems/1.8/gems/authr3-0.1.0/lib/authr/engine.rb:6: undefined method `isolate_namespace' for Authr::Engine:Class (NoMethodError)

Я пробовал все, и я смотрел на другие драгоценные камни, и у них есть модели с именами. Я убежден, что мне нужно пространство имен для моих моделей, чтобы быть уверенным, что они не конфликтуют с хост-приложением. Я хочу использовать restfullroutes, но не знаю, как решить эту проблему.

Я использую:

Daniel-Zs-MacBook-Pro:gem_test Daniel$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
Daniel-Zs-MacBook-Pro:gem_test Daniel$ rails -v
Rails 3.0.3

Спасибо за любой совет/помощь


person Daniël Zwijnenburg    schedule 28.03.2011    source источник
comment
Спасибо Cowboycoded, я обновил свой вопрос. Все еще выясняю, почему параметры не совпадают...   -  person Daniël Zwijnenburg    schedule 28.03.2011


Ответы (1)


Возможно опечатка?

scope "authr", :module => :authr, :as => "auth" do

изменить на

scope "authr", :module => :authr, :as => "authr" do #you are missing an r

Если это просто опечатка в этом посте, и у вас все правильно в движке, то что вы получаете, когда запускаете «рейк-маршруты» из родительского приложения, используя ту же область видимости в движке?

Кроме того, я думаю, что isolate_namespace сейчас только в краевых рельсах. Планируется, что в 3.1 будет много новых движков, в том числе и это.

person johnmcaliley    schedule 28.03.2011
comment
Спасибо за ваши мысли по этому поводу. Я исправил это в своем приложении, это действительно была опечатка, так что теперь я получаю форму. Следующая проблема заключается в том, что информация не сохраняется в базе данных: Параметры: {commit=›Submit, authentication_token=›cPH8ZmNmgoT84UMnYBoM38di+/OZQmuGQTrSv3HhFR4=, utf8=›✓, authr_account=›{uname=›username1test, password=› [FILTERED]}} Я знаю, что делаю @account = Account.new(params[:account]), но это должно работать как обычно, потому что контроллер также имеет пространство имен, верно? - person Daniël Zwijnenburg; 28.03.2011