Domanda

Ho seguito il seguente tutorial: http://www.themodestrubyist.com/2010/03/05/05/03/05/Rails-3-plugins---part-2--- -writing-an-engine/ E tutto funziona alla grande. Ho nominato il controller usando

#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
.

E nel tutorial non ha namespace il modello. Voglio namespace il mio modello anche se non si scontra con le app host. Quindi ho provato quanto segue:

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

Questa è la mia opinione, con una semplice form_for che dovrebbe andare su 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 %>
.

Ma quando utilizzo il mio modello Namespace ottengo il seguente errore:

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

L'oggetto creato dal nuovo metodo (@Account= Account.new) si traduce in questo:

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

Routes File: (funziona quando non sono namespace il modello.)

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

Quindi questa è una cosa di routing. Quando non faccio il namespace il modello funziona bene, ma quando non lo faccio non funziona. Poi ho provato quanto segue:

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

Ora ottengo il modulo senza l'errore di routing. Ma quando provo a inviare il modulo, l'oggetto non viene salvato.

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/
.

So che sto facendo @ccount= account.new (params [Account]) e se lo modillo su Account.New (params [: Authr_Account] che dovrei funzionare, ma voglio che i parametri utente [: Account] che dovrebbe funzionare correttamente? Perché anche il controller non è stato nominato ...

Poi ho trovato qualcosa sullo spazio isolato_name, quindi ho provato questo:

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

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

E ho cambiato i miei percorsi per:

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

Ma questo mi dà il seguente errore:

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

Ho provato tutto e ho guardato altre gemme e hanno modelli namespaced. Sono convinto che io bisogno allo spazio dei nomi i miei modelli solo per essere sicuri di non essere in conflitto con l'applicazione host. Voglio usare i riposalroutes ma non so come posso risolvere questo problema.

Sto usando:

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
.

Grazie per qualsiasi consiglio / help

È stato utile?

Soluzione

forse un typo?

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

Cambia a

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

Se è solo un battito di errore in questo post e lo hai corretto nel motore, allora cosa ottieni quando si esegue "rotte rastrelliere" dalla domanda genitore utilizzando lo stesso ambito nel motore?

Inoltre, penso che Isorate_Namespace sia solo in rotaie di bordo in questo momento.3.1 è previsto per avere un sacco di goody di nuovi motori, incluso questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top