2013-05-29 3 views
2

Ruby on Rails를 처음 사용하면서 레일 3.2.13과 루비 1.9.3p392를 사용했습니다. 내 혼란에 기여할 수있는 앱에서 사용할 엔진을 만들려고합니다.ruby ​​on rails 엔진 정의되지 않은 메소드 'delete'for nil : NilClass

엔진 이름은 sales_app입니다. sales_app/sales #에 데이터 묶음을 게시하여 판매를 생성하는 페이지가 있습니다. 판매 컨트롤러의 생성 액션에서는 데이터 처리를 약간하고 Sale 오브젝트를 인스턴스화하려고합니다. 모델에서 객체를 만드는 대신,을 호출한다는 사실조차 모르는 삭제 메서드 에 대해 NoMethodError 예외가 발생합니다. 도와주세요.

다음은 관련 세부 정보입니다. 내 판매/새 페이지 게시물 판매 번호에 다음 매개 변수를 만들 :

날짜 물건이 날짜를 변환하기위한 것입니다
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 

과 :

{"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"} 

판매 컨트롤러는 자사의 생성 작용에 대해 다음이 한 번에 하나의 datetime 시간이 걸릴 것이라고 생각합니다. 자체는 다음과 같은 판매 모델 (I이 중 일부는 다음과 같은 이유를 모르겠어요) :

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 

내 모델을 생성했고 나는 갈퀴 DB를했다 : 마이그레이션 할 수 있습니다. 내 스키마는 다음과 같습니다.

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 

스키마 파일은 주 앱에 있지만 판매 모델 파일은 엔진에 있습니다. 응.

그래서 내가 할 수있는 일은 아주 많습니다. 특히, 판매 객체를 만들 수없는 이유, 또는 하나를 생성하기 위해해야 ​​할 수도있는 일, 또는 적어도 왜 왜 정의되지 않은 삭제 메소드가 호출되는지 이유를 알기를 바랍니다. 어떤 도움이라도 대단히 감사 할 것입니다. 감사!

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

'레이크 루트'의 출력을 게시 할 수 있습니까? –

+0

그래, 그 결과는 다음과 같습니다 – Deranger

+0

sales_app_static_pages_home GET /sales_app/static_pages/home(.:format) sales_app/static_pages # 집 /sales_app/static_pages/help(.:format를 GET sales_app_static_pages_help) 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을 남겨두고 예상 한대로 작동하는 것 같습니다. redirect_to 'some/page/here'로 렌더링 'new'를 변경했습니다.

5) 내 엔진에서 판매 모델을 삭제하여 앱에 사본 만 남겨 둡니다 (이전에는 왠지 내 엔진과 앱에 판매 모델이있었습니다). 또한, 나는 "def initialize (attributes)"메소드를 모두 주석 처리했다. 저기서 뭐하고 있었는지조차 모르거나 내가 필요로 할 때 ...

도중에 다른 변경 사항이있을 수 있습니다. 나는 어떤 변화가 실제로 고정 된 것들인지 또는 그것이 여러 요인의 조합인지에 관해 정말로 확신하지 못한다. 그러나 이제 모델 객체를 만들고 조작 할 수 있습니다.

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

흠. 다른 결과를 얻을 수없는 것 같습니다. 리디렉션을 주석 처리하거나 렌더링 'new'로 바꾸더라도 동일한 예외가 발생합니다. 적어도 이것은 나에게 무언가를 제공합니다. – Deranger

+0

'정의되지 않은 메소드'삭제 'for nil : NilClass' 라인을 알려주시겠습니까? –

+0

SalesApp :: SalesController #에서 NoMethodError가 작성되었습니다. 정의되지 않은 메소드 'delete'for nil : NilClass Rails.root : c :/Users/Robert/workspaces/[프로젝트 이름]/[app_name] – Deranger

5

나는 이것이 오히려 오래된 질문이며이 답변이 원래 게시물에 직접 답하는 것은 아니라는 것을 알고 있습니다. 그러나 다른 누구도 "정의되지 않은 메소드 삭제"오류가 발생하여 어떤 일이 벌어지고 있는지 궁금해 할 때, 메소드 이름.

특히 "initialize"메소드는 Ruby와 마찬가지로 Rails에 예약되어있는 것으로 보입니다. 따라서 일부 데이터를 모델 (예 : before_validation : 초기화)에 연결하려는 메소드를 만들 경우 정의되지 않은 메소드 삭제 오류가 발생합니다. 메소드의 이름을 다른 것으로 지정하십시오 (예 : before_validation : init_my_model). 그러면 오류가 사라집니다.

@Deranger 초기화 방법이 엉망이 될 것이라고 생각합니다.

+0

initialize()를 유지하고 ActiveRecord를 초기화하는 방법에 대한 내 의견을 참조하십시오. –

0

난 그냥 내 자신의 코드 에서이 문제를 만났고, 꽤 당신뿐만 아니라 해결할 것입니다 간단한 해결책을 발견.

def initialize을 모델에 추가하면 ActiveRecord :: Base의 initialize 메서드가 재정의되어 결코 호출되지 않습니다. ,

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

그리고 액티브가 모두가 모조의 설정 도착을 : 나는 그 nil.delete()에 신비한 전화로 연결하는 방법을 완전히 명확하지 않다,하지만 고정하면 초기화 방법에 super에 대한 호출을 추가로 간단합니다 평화가 땅을 덮는다.

관련 문제