2011-03-28 3 views
0

Я последовал следующий урок: http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/Rails :: 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, который должен пойти в accounts_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.new (PARAMS [: authr_account], что я должен работать, но я хочу Титулы пользователь [: счета], который должен работать правильно, потому что контроллер в пространстве имен, а также ...

Тогда я нашел кое-что о isolated_name пространстве, так что я попытался это:

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

Я попробовал все, и я посмотрел на другие драгоценные камни, и они в пространстве имен модели. Я убежден, что i нуждается в для пространства имен моих моделей, чтобы быть уверенным, что они не конфликтуют с хост-приложением. Я хочу использовать 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 

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

+0

Спасибо Cowboycoded Я обновил свой вопрос. Все еще выясняя, почему параметры не совпадают ... –

ответ

1

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

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

изменение

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

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

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

+0

Спасибо за ваши мысли по этому вопросу. Я исправил это в своем приложении, это была действительно опечатка, так что теперь я получаю форму. Следующая проблема заключается в том, что информация не сохраняется в базе данных: Параметры: {"commit" => "Отправить", "authenticity_token" => "cPH8ZmNmgoT84UMnYBoM38di +/OZQmuGQTrSv3HhFR4 =", "utf8" => "✓ »,« authr_account »=> {« uname »=>« username1test »,« password »=>« [FILTERED] »}} Я знаю, что я делаю @account = Account.new (params [: account]), но это должно работать как «нормальное», потому что контроллер также именуется правильным? –

Смежные вопросы