2013-05-29 68 views
2

我是Ruby on Rails的新手,使用rails 3.2.13和ruby 1.9.3p392。我正在嘗試構建一個應用程序使用的引擎,這可能會導致我的困惑。ruby​​ on rails引擎undefined方法'delete'for nil:NilClass

引擎名稱是sales_app。我有一個頁面將一堆數據發佈到sales_app/sales#create來創建Sale。在銷售控制器的創建操作中,我會進行一些數據處理並嘗試實例化一個Sale對象。除了從模型創建對象外,我還得到一個NoMethodError異常,用於刪除方法,我甚至不知道我打電話給。請幫忙。

這裏是相關的細節。我的銷售/新頁的帖子下面的參數來銷售#創建:

{"sale"=>{"name"=>"Test", 
"desc"=>"This is a test", 
"start_date"=>"05/30/2013", 
"end_date"=>"05/31/2013", 
"start_time"=>"07:00", 
"end_time"=>"08:00", 
"products"=>""}, 
"create"=>"Create Sale"} 

銷售控制器有其創建下列行動:

def create 
    if params[:create] == "Create Sale" 
    # process the data - add a start and end to params 
    #format = "%m/%d/%Y %H:%M:%S" 
    params[:sale][:start] = DateTime.strptime("#{params[:sale][:start_date]} #{params[:sale][:start_time]}:00", '%m/%d/%Y %H:%M:%S') 
    params[:sale][:end] = DateTime.strptime("#{params[:sale][:end_date]} #{params[:sale][:end_time]}:00", '%m/%d/%Y %H:%M:%S') 
    @sale = Sale.new(:name => params[:sale][:name], :desc => params[:sale][:desc], :start => params[:sale][:start], :end => params[:sale][:end]) 
    if @sale.save 
     redirect_to @sale 
    else 
     render 'new' 
    end 
    else 
    render '/sales_app/static_pages/home' 
    end  
end 

日期東西是用於轉換日期和時間到一個單一的日期時間,我認爲這是工作。該銷售模式本身看起來如下(我甚至不知道爲什麼一些這方面是這樣):

module SalesApp 
    class Sale < ActiveRecord::Base 
    attr_accessible :desc, :end, :name, :start 
    def initialize(attributes = {}) 
     @name = attributes[:name] 
     @desc = attributes[:desc] 
     @start = attributes[:start] 
     @end = attributes[:end] 
    end 

    validates :name, presence: true, length: { maximum: 255 } 
    validates :desc, presence: true, length: { maximum: 65536 } 
    validates :start, presence: true 
    validates :end, presence: true 
    end 

end 

我產生我的模型,我做了一個耙分貝:遷移。我的模式如下所示:

ActiveRecord::Schema.define(:version => 20130527160623) do 

    create_table "sales", :force => true do |t| 
    t.string "name" 
    t.text  "desc" 
    t.datetime "start" 
    t.datetime "end" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

end 

模式文件位於主應用程序中,但銷售模型文件位於引擎中。啊。

因此,我可以做得更好,可能有很多。具體而言,我想知道爲什麼我無法創建Sale對象,或者我可能需要創建一個Sale對象,或者至少爲什麼某種未定義的刪除方法被調用時,我不知道爲什麼。任何援助將不勝感激。謝謝!

編輯耙路線顯示如下:

sales_app_static_pages_home GET /sales_app/static_pages/home(.:format) sales_app/static_pages#home 
sales_app_static_pages_help GET /sales_app/static_pages/help(.:format) sales_app/static_pages#help 
      sales_app_sales GET /sales_app/sales(.:format)    sales_app/sales#index 
          POST /sales_app/sales(.:format)    sales_app/sales#create 
new_sales_app_sale   GET /sales_app/sales/new(.:format)   sales_app/sales#new 
edit_sales_app_sale   GET /sales_app/sales/:id/edit(.:format) sales_app/sales#edit 
sales_app_sale    GET /sales_app/sales/:id(.:format)   sales_app/sales#show 
          PUT /sales_app/sales/:id(.:format)   sales_app/sales#update 
          DELETE /sales_app/sales/:id(.:format)   sales_app/sales#destroy 
sales_app_root  /sales_app(.:format)     sales_app/static_pages#home 
+1

你可以發佈'rake routes'的輸出嗎? –

+0

呀,結果是: – Deranger

+0

sales_app_static_pages_home GET /sales_app/static_pages/home(.:format)sales_app/static_pages#家 sales_app_static_pages_help GET /sales_app/static_pages/help(.:format)sales_app/static_pages#幫助 sales_app_sales GET/sales_app /sales(.:format)sales_app/sales#index POST /sales_app/sales(.:format)sales_app/sales#create – Deranger

回答

0

爲了什麼這是值得的,我已經解決了我遇到的任何問題,並且我不確定問題解決的方向。以下是我所做的一些事情。

1)在我的應用程序的routes.rb文件中,我用命名空間來代替「掛載」它們的路線。我通過添加:mount [appname] :: Engine =>「/ [root directory]」,:as =>「namespaced」來改變它。

2)我將我的銷售模型的「:end」和「:start」屬性更改爲「:ending」和「:starting」,只是因爲「:end」似乎是一個非常糟糕的術語。我回滾了我的遷移,編輯了遷移,並執行了rake db:migrate。

3)在我的銷售員中,我將Sale.new(blahblahblah)更改爲:: Sale.new(blahblahblah)。我不知道這是否有必要。我現在很害怕看任何東西。

4)在我的銷售控制器中,我離開了redirect_to @sale,它似乎在做我期望的。我確實將渲染「new」更改爲redirect_to「some/page/here」。 5)我從我的引擎中刪除了銷售模式,只在應用中留下了一個副本(以前,由於某種原因,我在我的引擎和應用中有銷售模式)。此外,我註釋了所有的「def初始化(屬性)」方法。甚至不知道那裏正在做什麼,或者如果我需要它...

沿途可能有一些其他的變化。我真的不確定實際上哪些變化是固定的,或者是否是多種因素的綜合。但我現在可以創建和操作模型對象。

0

if @sale.save 
    redirect_to @sale 
else 
    render 'new' 
end 

redirect_to @sale,@sale將獲得方法刪除

變化

if @sale.save 
    redirect_to sales_app_sales_path # or whatever do you want 
else 
    render 'new' 
end 
+0

嗯。似乎無法得到任何不同的結果。即使我註釋掉重定向或將其替換爲新的渲染,我也會得到相同的異常。不過,這至少給了我一些鼓勵。 – Deranger

+0

你能告訴我一行'未定義的方法'delete'for nil:NilClass'嗎? –

+0

SalesApp :: SalesController中的NoMethodError#create 未定義的方法'delete'for nil:NilClass Rails.root:c:/ Users/Robert/workspaces/[project_name]/[app_name] – Deranger

5

我知道這是一個相當老的問題,這個答案並不直接回答原來的帖子,但如果有人絆倒了「未定義的方法刪除」錯誤,並想知道發生了什麼,它可能需要做你的方法名稱。

具體來說,似乎在Ruby中保留了Rails中的「initialize」方法。因此,如果你正在製作一個旨在將某些數據插入到你的模型中的方法(例如before_validation:initialize),你會得到未定義的方法刪除錯誤。將該方法命名爲其他名稱(例如before_validation:init_my_model),錯誤將消失。

@Deranger我懷疑初始化方法是一個糟糕的事情。

+0

請參閱下面的我的評論以瞭解如何保持initialize()並獲取ActiveRecord的初始化。 –

0

我剛剛在自己的代碼中遇到了這個問題,並找到了一個簡單的解決方案,我很確定它也會修復你的問題。

當您將def initialize添加到您的模型中時,它會覆蓋ActiveRecord :: Base中的initialize方法,從而永遠不會調用它。我並不完全清楚如何通向神祕呼叫nil.delete(),但修復它很簡單,只要在你的初始化方法增加super呼叫:

def initialize(attributes = {}) 
    @name = attributes[:name] 
    @desc = attributes[:desc] 
    @start = attributes[:start] 
    @end = attributes[:end] 
    super(attributes) ### Add this line! 
end 

然後ActiveRecord的到達設置所有它的魔力,和平覆蓋了這片土地。

相關問題