2010-07-22 2 views
2

이 방법은 로컬 컴퓨터에서 작동하지만 원격 서버에서는 작동하지 않습니다. 블록을 찾고 있지만 블록을 배치하는 '위치'또는 '방법'을 알지 못합니다.레일에서 LocalJumpError (No Block Given)

def generate_csv 
    if params[:print_envelopes] 
    @signups = CardBatch.find(params[:id]).card_signups.each.reject { |a| a.envelope? } 
    @filename = 'envelopes.csv' 
    csv_string = FasterCSV.generate do |csv| 
     csv << ["first name, last name, street address, city, state, zip code"] 
     @signups.each do |signup| 
     csv << [signup.first_name, signup.last_name, signup.street_address_1, signup.city, signup.state, signup.zip_code] 
     signup.envelope = true 
     signup.save 
     end 
    end 
    elsif params[:print_cards] 
    @signups = CardBatch.find(params[:id]).card_signups.reject { |a| a.card? } 
    @filename = 'cards.csv' 
    csv_string = FasterCSV.generate do |csv| 
     csv << ["name", "expiration date", "card number"] 
     @signups.each do |signup| 
     csv << [signup.full_name, signup.exp_date.strftime('%m/%y'), signup.formatted_card_number] if card? 
     signup.card = true 
     signup.save 
     end 
    end 
    end 

    send_data(csv_string, 
    :type => 'text/csv; charset=utf-8; header=present', 
    :filename => @filename) 
end 

오류 : will_paginate이 컨트롤러의 초점을 아무 곳이라고

경우

Processing Admin::CardBatchesController#generate_csv (for 173.161.167.41 at 2010-07-21 07:19:47)  [POST] 
    Parameters: {"action"=>"generate_csv",  "authenticity_token"=>"OcDII/t8ZleZxRBpISi+Giw+4MAV2Cjjq8bdixJJ+I8=", "id"=>"4", "controller"=>"admin/card_batches", "print_envelopes"=>"print envelopes"} 

LocalJumpError (no block given): 
    vendor/gems/mislav-will_paginate-2.3.11/lib/will_paginate/finder.rb:170:in `method_missing' 
    app/controllers/admin/card_batches_controller.rb:62:in `generate_csv' 
    haml (2.2.2) [v] rails/./lib/sass/plugin/rails.rb:19:in `process' 
    lib/flash_session_cookie_middleware.rb:14:in `call' 
    vendor/gems/hoptoad_notifier-2.2.2/lib/hoptoad_notifier/rack.rb:27:in `call' 

** [Hoptoad] Failure: Net::HTTPClientError 
** [Hoptoad] Environment Info: [Ruby: 1.8.6] [Rails: 2.3.3] [Env: production] 
** [Hoptoad] Response from Hoptoad: 
<?xml version="1.0" encoding="UTF-8"?> 
<errors> 
<error>No project exists with the given API key.</error> 
</errors> 
Rendering /data/HQ_Channel2/releases/20100721141730/public/500.html (500 Internal Server Error) 

업데이트,이 기능을 실행합니다.

이 기능 라인 (170)

def method_missing_with_paginate(method, *args) #:nodoc: 
    # did somebody tried to paginate? if not, let them be 
    unless method.to_s.index('paginate') == 0 
     if block_given? 
     return method_missing_without_paginate(method, *args) { |*a| yield(*a) } 
     else 
     return method_missing_without_paginate(method, *args) 
     end 
    end 

    # paginate finders are really just find_* with limit and offset 
    finder = method.to_s.sub('paginate', 'find') 
    finder.sub!('find', 'find_all') if finder.index('find_by_') == 0 

    options = args.pop 
    raise ArgumentError, 'parameter hash expected' unless options.respond_to? :symbolize_keys 
    options = options.dup 
    options[:finder] = finder 
    args << options 

    paginate(*args) { |*a| yield(*a) if block_given? } 
    end 

주위 그리고 어떤 이유로 Finder.rb, 이상 작성 내 기능은 일치하지 않습니다. 해결할 수 있으면이 티켓을 닫을 수 있습니다.

+0

무엇'처럼 사용보기 코드를 살펴 will_paginate'입니까? –

+0

원래 질문 (http://stackoverflow.com/questions/3300539/localjumperror-no-block-given-in-rails)에 어떤 현상이 발생 했습니까? 사람들은 거기에 답변 및/또는 의견을 게시하기 위해 노력했습니다. –

+0

젠장, 내가 전에 본 줄 알았는데! 16 분 전에 삭제되었습니다. –

답변

6

method_missing_without_paginate 방법은 alias_method_chain에서 유래합니다. will_paginate는 기본 동작 인 method_missing이 Active Record에 추가되기 전에 동작을 추가합니다.

나는

@signups = CardBatch.find(params[:id]).card_signups.each.reject { |a| a.envelope? } 

오류가 (이 라인 (62)이다)이 줄에있는 키 비트를 추측하고있어 : card_signups.each.reject {

당신은 아마 당신의 로컬 컴퓨터에 1.8.7이있다. 1.8.7에서 블록이없는 each은 반복 할 수있는 Enumerator 개체를 반환합니다. 이것은 1.9에서 backported 굉장합니다.

그러나 1.8.6은 그렇게하지 않습니다. 1.8.6에서 each은 블록이 작동해야합니다. 이 표현식에 each이 필요 없기 때문에 괜찮습니다.

@signups = CardBatch.find(params[:id]).card_signups.reject { |a| a.envelope? } 

으로 그 라인을 교체하고 그것을 작동합니다.

또 다른 한가지는 대략 card_signups 일 것입니다. 당신은 :conditions을 사용하여 필터링을 수행하도록 db에 알릴 수 있습니다.

당신이 봉투라는 부울 열을 사용하는 가정하면, 그 결과는 다음과 같습니다

@signups = CardBatch.find(params[:id]).card_signups.all :conditions => {:envelope=>false} 
+0

아직 테스트하지는 않았지만, 당신이 이걸 완전히 털어 놓았다고 확신합니다. 내 서버가 1.8에서 실행됩니다.6, 내 지역은 1.8.7입니다! 빅이 바로 거기에 말해. – Trip

+2

BaroqueBobcat에게 "Baroque가 아니라면 고치지 마라. – Trip