2016-03-26 9 views
1

Mein routes.rb sieht aus, als solche:Rails - UndefinedMethod in Modell # neue Aktion

resources :users do 
resources :reservations do 
    resources :orders 
end 
end 

resources :reservations do 
resources :orders 
end 

Modelle:

class User < ActiveRecord::Base 
    has_many :reservations 
    has_many :orders, :through => :reservations 
end 

class Reservation < ActiveRecord::Base 
    has_one :order 
    belongs_to :user 
end 

class Order < ActiveRecord::Base 
    belongs_to :reservation 
end 

Controller:

class ReservationsController < ApplicationController 

    def new 
    if current_user 
    @user   = User.find_by_id(current_user) 
    @reservation = @user.reservations.build 
    else 
    @reservation = Reservation.new 
    end 
    end 

    #leaving out the save portion to make question shorter. 
    def create 
    if current_user 
    @user   = User.find(current_user) 
    @reservation = @user.reservations.create(reservation_params) 
    else 
    @reservation = Reservation.new(reservation_params) 
    end 
    end 
end 

class OrdersController < ApplicationController 

    def new 
    if current_user 
    @user   = User.find_by_id(current_user) 
    @order  = @user.build_order 
    else 
    @reservation = Reservation.find_by_id(params[:reservation_id]) 
    @order  = @reservation.build_order 
    end 
    end 

    def create 
    if current_user 
    @user   = User.where(current_user) 
    @order  = @user.orders.create(order_params) 
    else 
    @reservation = Reservation.find(params[:reservation_id]) 
    @order  = @reservation.create_order(order_params) 
    end 
    end 
end 

Fehler

NoMethodError in Orders # new

nicht definierte Methode `build_order 'für #

Voll Stack-Trace ist als solche:

activemodel (4.2.5) lib/active_model/attribute_methods.rb:433:in      `method_missing' 
app/controllers/orders_controller.rb:29:in `new' 
actionpack (4.2.5)  lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
actionpack (4.2.5) lib/abstract_controller/base.rb:198:in ` process_action' 
actionpack (4.2.5) lib/action_controller/metal/rendering.rb:10:in `process_action' 
actionpack (4.2.5) lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
activesupport (4.2.5) lib/active_support/callbacks.rb:117:in `call' 
activesupport (4.2.5) lib/active_support/callbacks.rb:117:in `call' 
activesupport (4.2.5) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile' 
activesupport (4.2.5) lib/active_support/callbacks.rb:505:in `call' 
activesupport (4.2.5) lib/active_support/callbacks.rb:505:in `call' 
activesupport (4.2.5) lib/active_support/callbacks.rb:92:in  `__run_callbacks__' 
activesupport (4.2.5) lib/active_support/callbacks.rb:778:in  `_run_process_action_callbacks' 
activesupport (4.2.5) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (4.2.5) lib/abstract_controller/callbacks.rb:19:in `process_action' 
actionpack (4.2.5) lib/action_controller/metal/rescue.rb:29:in `process_action' 
actionpack (4.2.5)  lib/action_controller/metal/instrumentation.rb:32:in `block in process_action' 
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `block in instrument' 
activesupport (4.2.5) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `instrument' 
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
actionpack (4.2.5) lib/action_controller/metal/params_wrapper.rb:250:in `process_action' 
activerecord (4.2.5) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (4.2.5) lib/abstract_controller/base.rb:137:in `process' 
actionview (4.2.5) lib/action_view/rendering.rb:30:in `process' 
actionpack (4.2.5) lib/action_controller/metal.rb:196:in `dispatch' 
actionpack (4.2.5) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
actionpack (4.2.5) lib/action_controller/metal.rb:237:in `block in action' 
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:76:in `call' 
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:76:in `dispatch' 
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:45:in `serve' 
actionpack (4.2.5) lib/action_dispatch/journey/router.rb:43:in `block in serve' 
actionpack (4.2.5) lib/action_dispatch/journey/router.rb:30:in `each' 
actionpack (4.2.5) lib/action_dispatch/journey/router.rb:30:in `serve' 
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:817:in `call' 
rack (1.6.4) lib/rack/etag.rb:24:in `call' 
rack (1.6.4) lib/rack/conditionalget.rb:25:in `call' 
rack (1.6.4) lib/rack/head.rb:13:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/flash.rb:260:in `call' 
rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context' 
rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/cookies.rb:560:in `call' 
activerecord (4.2.5) lib/active_record/query_cache.rb:36:in `call' 
activerecord (4.2.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call' 
activerecord (4.2.5) lib/active_record/migration.rb:377:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
activesupport (4.2.5) lib/active_support/callbacks.rb:88:in  `__run_callbacks__' 
activesupport (4.2.5) lib/active_support/callbacks.rb:778:in  `_run_call_callbacks' 
activesupport (4.2.5) lib/active_support/callbacks.rb:81:in  `run_callbacks' 
actionpack (4.2.5) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/reloader.rb:73:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/remote_ip.rb:78:in `call' 
actionpack (4.2.5)    lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
web-console (2.3.0) lib/web_console/middleware.rb:28:in `block in call' 
web-console (2.3.0) lib/web_console/middleware.rb:18:in `catch' 
web-console (2.3.0) lib/web_console/middleware.rb:18:in `call' 
actionpack (4.2.5)  lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
railties (4.2.5) lib/rails/rack/logger.rb:38:in `call_app' 
railties (4.2.5) lib/rails/rack/logger.rb:20:in `block in call' 
activesupport (4.2.5) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
activesupport (4.2.5) lib/active_support/tagged_logging.rb:26:in `tagged' 
activesupport (4.2.5) lib/active_support/tagged_logging.rb:68:in `tagged' 
railties (4.2.5) lib/rails/rack/logger.rb:20:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
rack (1.6.4) lib/rack/methodoverride.rb:22:in `call' 
rack (1.6.4) lib/rack/runtime.rb:18:in `call' 
activesupport (4.2.5)  lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call' 
rack (1.6.4) lib/rack/lock.rb:17:in `call' 
actionpack (4.2.5) lib/action_dispatch/middleware/static.rb:116:in `call' 
rack (1.6.4) lib/rack/sendfile.rb:113:in `call' 
railties (4.2.5) lib/rails/engine.rb:518:in `call' 
railties (4.2.5) lib/rails/application.rb:165:in `call' 
rack (1.6.4) lib/rack/content_length.rb:15:in `call' 
puma (3.1.0) lib/puma/configuration.rb:227:in `call' 
puma (3.1.0) lib/puma/server.rb:561:in `handle_request' 
puma (3.1.0) lib/puma/server.rb:406:in `process_client' 
puma (3.1.0) lib/puma/server.rb:271:in `block in run' 
puma (3.1.0) lib/puma/thread_pool.rb:111:in `call' 
puma (3.1.0) lib/puma/thread_pool.rb:111:in `block in spawn_thread' 

Ich bin in der Lage eine Reservierung und machen, wenn nicht, es gebe' current_user ', aber wo ich auf ein Problem stoße ist, wenn ein Benutzer angemeldet ist, kann ich eine Reservierung machen und es in der Datenbank speichern, aber dann bekomme ich keinen Fehler in der Reihenfolge # new controller @order = @ user.build_order Zeile. Ich habe viele Varianten ausprobiert wie @ user.order.new, @ user.order.build

Ich habe auch versucht, @order = @ user.reservations.order (params [: reservation_id]), aber das führt Ich zu einem 'to_key' Problem für die Bestellungen _form.

Keine der Optionen, die ich erwähnt habe, funktionieren noch mehr Optionen, die ich ausprobiert habe, an die ich mich nicht mehr erinnere. Ich würde die Hilfe sehr schätzen.

Bitte lassen Sie mich wissen, wenn weitere Informationen von mir benötigt werden, werde ich versuchen, es bald wie möglich zu veröffentlichen.

+0

Geben Sie die vollständige Fehlernachricht mit der Zeilennummer ein. – Substantial

+0

@Substantial hat gerade die Fehlermeldungen hinzugefügt, kann aber scheinbar keine Zeilennummern zu den eigentlichen Fehlermeldungen hinzufügen. – ayounis90

+0

Ich sehe sie. Du hast es richtig gemacht. – Substantial

Antwort

2

Ändern @user.build_order zu @user.orders.build.

Ersterer wird für belongs_to Assoziationen verwendet, die auf ein besitzendes Objekt zeigen.

belongs_to methods

Letzteres ist für has_many -Stil Verbände, die auf eine Erfassung, dh. "Build auf die Bestellungen dieses Benutzers."

has_many methods

Ihre Nutzer haben eine Sammlung von Aufträgen (has_many Vereinigung), so dass Sie build auf dem Benutzer-Sammlung von Aufträgen stattdessen auf den Benutzer selbst nennen.

+0

Vielen Dank für die Anleitung, ich schätze es sehr, Sie haben viel geholfen. Zusammen mit @Dharam. Ich bin mir nicht sicher, wer für die richtige Antwort stimmen sollte, technisch gesehen, antwortet er eine Minute vor dir und ich würde es hassen, ihn von der richtigen Antwort zu berauben. Aber da Sie eine viel tiefere Antwort haben, denke ich, dass es sinnvoll wäre, Ihnen die richtige Antwort zu geben. – ayounis90

+0

Also, nachdem ich Ihren Rat genommen und gesehen habe, was ich falsch gemacht habe, ging ich durch einige der Unterlagen, um zu sehen, wo ich mit der Aktion "Order # create" falsch laufen könnte. Ich bin mir nicht sicher, ob meine Assoziationen falsch sind. Fehler im Erhalten ist: ActiveRecord :: HasManyThroughCantAssociateThroughHasOneOrManyReflection in OrdersController # create Kann Verband 'User # Orders' nicht ändern, da die Quellreflexionsklasse 'Order' über 'has_one' mit 'Reservierung' verknüpft ist. Ich würde es wirklich schätzen, wenn Sie helfen könnten. Habe keine neue Frage gestellt, da ich das Gefühl hatte, dass es mit dieser Frage zusammenhängt. – ayounis90

+0

Ich konnte dieses Problem beheben, indem ich die Verknüpfungen änderte. anstatt "@ user.orders.create" habe ich es einfach in "@ reservation.create_order" geändert und es funktioniert einwandfrei. – ayounis90

1

Ihre Userhas_many :orders. @user.build_order funktioniert nur, wenn Sie has_one :order oder belongs_to :order in Ihrem User haben.

Als Userhas_many :orders sollten Sie @user.orders.build in Ihrem OrdersController#new verwenden.

Weitere Informationen zum Erstellen von Beziehungen finden Sie unter ActiveRecord::Associations.