2014-07-23 1 views
0

Ruby on Rails 4.1을 사용하여 샘플 프로젝트로 티켓 예약 앱을 만들고 있습니다. 세 가지 모델 - 이벤트, 티켓 및 예약입니다. 이벤트에는 많은 티켓과 예약이 있습니다. 티켓에는 많은 예약이 있으며 이벤트에 속합니다. 예약은 이벤트와 티켓에 속합니다. 같은뷰에서 모델 메소드를 사용할 수 없습니다.

티켓 구입 컨트롤러 같습니다

티켓 모델이

class Ticket < ActiveRecord::Base 
belongs_to :event 
has_many :bookings 

def maximum_tickets_allowed 
    max = ticket.maximum_quantity.to_i 
    self.maximum_quantity = (1..max).to_a 
end 

    end 

과 같은

class TicketsController < ApplicationController 
def index 
    @event = Event.find(params[:event_id]) 
    @tickets = @event.tickets.all 
end 

def show 
    @event = Event.find(params[:event_id]) 
    @ticket = @event.tickets.find(params[:id]) 
end 

def new 
    @event = Event.find(params[:event_id]) 
    @ticket = Ticket.new 
end 

def create 
    @event = Event.find(params[:event_id]) 
    @ticket = @event.tickets.create(ticket_params) 
    if @ticket.save 
     redirect_to [@event, @ticket] 
    else 
     render 'new' 
    end 
end 

def edit 
    @event = Event.find(params[:event_id]) 
    @ticket= @event.tickets.find(params[:id]) 
end 

def update 
    @event = Event.find(params[:event_id]) 
    @ticket = @event.tickets.find(params[:id]) 

    if @ticket.update(ticket_params) 
     redirect_to [@event, @ticket] 
    else 
     render 'edit' 
    end 
end 

def destroy 
    @event = Event.find(params[:event_id]) 
    @ticket = @event.tickets.find(params[:id]) 
    @ticket.destroy 
    redirect_to event_tickets_path 
end 


private 

def ticket_params 
    params.require(:ticket).permit(:ticket_name, :booking_start_date, :booking_end_date, :ticket_price, :ticket_quantity, :minimum_quantity, :maximum_quantity, :terms_conditions, :more_information) 
end 

끝 티켓 파일이 보인다 보여 같은 :

<h2>Tickets</h2> 

<p><%= @ticket.ticket_name %></p> 
<p><%= @ticket.booking_start_date %></p> 
<p><%= @ticket.booking_end_date %></p> 
<p><%= @ticket.maximum_tickets_allowed %></p> 

maxium_quantity은 예약 할 수있는 티켓의 최대 수이며 여기서는 collection_select에 사용할 배열로 변환하려고합니다.

이제 <%= @ticket.maximum_tickets_allowed %>을 사용하면 maximum_tickets_allowed가 undefined method이고 'error. I tried using self.maximum_tickets_allowed`가되지만 작동하지 않습니다. 내가 어디로 잘못 가고 있니? 오류의

전체 스택 추적 : 당신은 메서드 내 ticket.maximum_quanitity를 호출하고

activemodel (4.1.1) lib/active_model/attribute_methods.rb:435:in `method_missing' 
activerecord (4.1.1) lib/active_record/attribute_methods.rb:206:in `method_missing' 
app/views/tickets/show.html.erb:6:in `_app_views_tickets_show_html_erb__2112154808966627486_70166705061960' 
actionview (4.1.1) lib/action_view/template.rb:145:in `block in render' 
activesupport (4.1.1) lib/active_support/notifications.rb:161:in `instrument' 
actionview (4.1.1) lib/action_view/template.rb:339:in `instrument' 
actionview (4.1.1) lib/action_view/template.rb:143:in `render' 
actionview (4.1.1) lib/action_view/renderer/template_renderer.rb:55:in `block (2 levels) in render_template' 
actionview (4.1.1) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument' 
activesupport (4.1.1) lib/active_support/notifications.rb:159:in `block in instrument' 
activesupport (4.1.1) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (4.1.1) lib/active_support/notifications.rb:159:in `instrument' 
actionview (4.1.1) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument' 
actionview (4.1.1) lib/action_view/renderer/template_renderer.rb:54:in `block in render_template' 
actionview (4.1.1) lib/action_view/renderer/template_renderer.rb:62:in `render_with_layout' 
actionview (4.1.1) lib/action_view/renderer/template_renderer.rb:53:in `render_template' 
actionview (4.1.1) lib/action_view/renderer/template_renderer.rb:17:in `render' 
actionview (4.1.1) lib/action_view/renderer/renderer.rb:42:in `render_template' 
actionview (4.1.1) lib/action_view/renderer/renderer.rb:23:in `render' 
actionview (4.1.1) lib/action_view/rendering.rb:99:in `_render_template' 
actionpack (4.1.1) lib/action_controller/metal/streaming.rb:217:in `_render_template' 
actionview (4.1.1) lib/action_view/rendering.rb:82:in `render_to_body' 
actionpack (4.1.1) lib/action_controller/metal/rendering.rb:32:in `render_to_body' 
actionpack (4.1.1) lib/action_controller/metal/renderers.rb:32:in `render_to_body' 
actionpack (4.1.1) lib/abstract_controller/rendering.rb:25:in `render' 
actionpack (4.1.1) lib/action_controller/metal/rendering.rb:16:in `render' 
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:41:in `block (2 levels) in render' 
activesupport (4.1.1) lib/active_support/core_ext/benchmark.rb:12:in `block in ms' 
/Users/mohan/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/benchmark.rb:294:in `realtime' 
activesupport (4.1.1) lib/active_support/core_ext/benchmark.rb:12:in `ms' 
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:41:in `block in render' 
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:84:in `cleanup_view_runtime' 
activerecord (4.1.1) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime' 
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:40:in `render' 
actionpack (4.1.1) lib/action_controller/metal/implicit_render.rb:10:in `default_render' 
actionpack (4.1.1) lib/action_controller/metal/implicit_render.rb:5:in `send_action' 
actionpack (4.1.1) lib/abstract_controller/base.rb:189:in `process_action' 
actionpack (4.1.1) lib/action_controller/metal/rendering.rb:10:in `process_action' 
actionpack (4.1.1) lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
activesupport (4.1.1) lib/active_support/callbacks.rb:113:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:113:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `block in halting' 
activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `block in halting' 
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting' 
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting' 
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting' 
activesupport (4.1.1) lib/active_support/callbacks.rb:86:in `call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:86:in `run_callbacks' 
actionpack (4.1.1) lib/abstract_controller/callbacks.rb:19:in `process_action' 
actionpack (4.1.1) lib/action_controller/metal/rescue.rb:29:in `process_action' 
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
activesupport (4.1.1) lib/active_support/notifications.rb:159:in `block in instrument' 
activesupport (4.1.1) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (4.1.1) lib/active_support/notifications.rb:159:in `instrument' 
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
actionpack (4.1.1) lib/action_controller/metal/params_wrapper.rb:250:in `process_action' 
activerecord (4.1.1) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (4.1.1) lib/abstract_controller/base.rb:136:in `process' 
actionview (4.1.1) lib/action_view/rendering.rb:30:in `process' 
actionpack (4.1.1) lib/action_controller/metal.rb:195:in `dispatch' 
actionpack (4.1.1) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
actionpack (4.1.1) lib/action_controller/metal.rb:231:in `block in action' 
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:80:in `call' 
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:80:in `dispatch' 
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:48:in `call' 
actionpack (4.1.1) lib/action_dispatch/journey/router.rb:71:in `block in call' 
actionpack (4.1.1) lib/action_dispatch/journey/router.rb:59:in `each' 
actionpack (4.1.1) lib/action_dispatch/journey/router.rb:59:in `call' 
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:676:in `call' 
rack (1.5.2) lib/rack/etag.rb:23:in `call' 
rack (1.5.2) lib/rack/conditionalget.rb:25:in `call' 
rack (1.5.2) lib/rack/head.rb:11:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/flash.rb:254:in `call' 
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context' 
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/cookies.rb:560:in `call' 
activerecord (4.1.1) lib/active_record/query_cache.rb:36:in `call' 
activerecord (4.1.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call' 
activerecord (4.1.1) lib/active_record/migration.rb:380:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
activesupport (4.1.1) lib/active_support/callbacks.rb:82:in `run_callbacks' 
actionpack (4.1.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/reloader.rb:73:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
railties (4.1.1) lib/rails/rack/logger.rb:38:in `call_app' 
railties (4.1.1) lib/rails/rack/logger.rb:20:in `block in call' 
activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
activesupport (4.1.1) lib/active_support/tagged_logging.rb:26:in `tagged' 
activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged' 
railties (4.1.1) lib/rails/rack/logger.rb:20:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' 
rack (1.5.2) lib/rack/runtime.rb:17:in `call' 
activesupport (4.1.1) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call' 
rack (1.5.2) lib/rack/lock.rb:17:in `call' 
actionpack (4.1.1) lib/action_dispatch/middleware/static.rb:64:in `call' 
rack (1.5.2) lib/rack/sendfile.rb:112:in `call' 
railties (4.1.1) lib/rails/engine.rb:514:in `call' 
railties (4.1.1) lib/rails/application.rb:144:in `call' 
rack (1.5.2) lib/rack/lock.rb:17:in `call' 
rack (1.5.2) lib/rack/content_length.rb:14:in `call' 
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service' 
/Users/mohan/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service' 
/Users/mohan/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run' 
/Users/mohan/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread' 
+0

컨트롤러 작업을 게시하고 보시기 바랍니다. – DickieBoy

+1

또한 전체 오류 stacktrace 게시하십시오 – Pavan

+0

또한 나는'티켓'정의되지 않은 것 같아요. 'maximum_quantity' 속성을 원한다면'self.maximum_quantity' 또는 단지'maximum_quantity'에서 호출 할 수 있습니다. – DickieBoy

답변

0

몇 가지 사항에 대해 알아보십시오.

의견에 따르면 @ticket 변수가 nil 인 것 같습니다. @event.tickets.find(params[:id])ActiveRecord::RecordNotFoundError과 같은 Ticket.find이 던져 지는지 확실하지 않습니다. 컨트롤러에 대한 데이터를 얻는 방법은 Rails 방식과 비슷합니다. 티켓과 이벤트 사이에는 일대일 관계가 있습니다. TicketsController#show 메소드에는 event_idid을 전달할 필요가 없습니다. 그냥 티켓 ID를 전달 : 티켓이 존재하지 않는 경우 ActiveRecord::RecordNotFoundError을 올릴 것이다 Ticket.find를 사용

class TicketsController < ApplicationController 

    def show 
    @ticket = Ticket.find params[:id] 
    @event = @ticket.event 
    end 

end 

. 올바르게 기억하면 레일스의 기본 컨트롤러 오류 처리가 해당 예외를 잡아서 404 Not Found 페이지를 렌더링해야하므로 Ticket.find 이후에는 티켓 객체를 사용할 수 있습니다.

다음으로 여전히 @event 인스턴스 변수가 필요한 경우 ActiveRecord 관계를 사용하여 @ticket.event을 통해 가져옵니다.

지금 모델 자체는 다음 코드를 필요 :

class Ticket < ActiveRecord::Base 
    belongs_to :event 
    has_many :bookings 

    def maximum_tickets_allowed 
    (1..self.maximum_quantity).to_a 
    end 
end 

maximum_tickets_allowed 메소드는 배열을 반환해야합니다. 또한 Range의 끝 값으로 메서드 호출이 Ruby 인터프리터를 트리핑하는지 궁금합니다.직접 Range 개체의 인스턴스를 시도 할 수 :

def maximum_tickets_allowed 
    Range.new(1, maximum_quantity).to_a 
    end 

을보기가 변경되지 :

<h2>Tickets</h2> 

<p><%= @ticket.ticket_name %></p> 
<p><%= @ticket.booking_start_date %></p> 
<p><%= @ticket.booking_end_date %></p> 
<p><%= @ticket.maximum_tickets_allowed %></p> 

편집 # 1 : 언급 위의 댓글, 당신은 모든 액티브 레코드를 실행했는지 확인 데이터베이스의 maximum_quantity 열이 최근에 추가 된 경우 마이그레이션이 필요합니다. 그렇지 않으면 Rails 앱이 부팅 될 때 ActiveRecord에 의해 자동으로 생성되지 않습니다.

편집 # 2 : 메서드에서 이벤트를 찾은 다음 모든 티켓과 이벤트에서 사용할 수있는 티켓 중 하나만 가져옵니다. ID를 얻은 다음 티켓 개체에서 이벤트를 가져 오는 것이므로 티켓을 잡는 것만 큼 효율적이지 않습니다.

ActiveRecord 컬렉션의 find 메서드에 대한 설명서를 찾을 수 없으므로 해당 동작의 유효성을 검사 할 수 없습니다.

+0

양해 해 주셔서 감사합니다. 여러 번 시도한 후에이 메서드는 다시 작업하기 시작했습니다. 어제의 제안은 오늘 잘 진행되었습니다. 나는 Rails 서버를 매번 시작했고 심지어 여러 번 메소드의 이름을 변경하려고 시도했습니다. 그러나, 그것은 갑자기 일하기 시작했습니다. 브라우저 캐시가 이유가 될 수 있었습니까 (그러나 모든 페이지가로드 된 후에 메소드 이름이 변경되었습니다)? – user3224820

+0

'TicketsController # show' 페이지가 브라우저에 의해 캐시 되었다면 실제로 서버에 HTTP 요청을하는 대신 매번 캐시 된 페이지를 보여줄 것입니다. 브라우저에 다시 전송되는 캐시 헤더는 무엇입니까? –

+0

캐시 헤더를 모른다. 하지만 max_charge, max_collect 등의 메소드 이름을 여러 번 변경하려고 시도했는데 오류 페이지의 메소드 이름이 각 페이지로드와 함께 변경된다는 사실을 기억합니다. 대부분의 경우 해당 메소드를 보았지만 대부분 누락되었을 수 있습니다. – user3224820

1

당신이 티켓 인스턴스 메소드를 사용하고 있기 때문에, 그냥 maximum_quantity이어야한다?

+0

'(1..maximum_quantity.to_i) .to_a'를 반환하면 충분합니다. –

+0

@agmcleod 나는 그것을 고쳤으며 여전히 변화가 없다. – user3224820

+0

@GregBurghardt가 지금 당장 시도했지만 아직 개척하지 않았습니다. – user3224820

관련 문제