2017-10-29 1 views
-2

Ich habe einen Controller Orders. Dieser Controller führt basierend auf der POST-Anforderung verschiedene Aktionen aus. Wenn ein Benutzer ein Produkt kauft, geht es zu seinem Vorrat. Daher können nur Produkte auf Lager verkauft werden. Die Tabelle hat eine Spalte product_id. Einfach gesagt, wenn ein Benutzer auf products/product_id Seite bestellt werden muss, muss ein Kauf sein, wenn auf Aktien/stock_id Seite Auftrag verkauft werden muss.Ruby on Rails: Wenn Else basierend auf params [: Beispiel]

routes.rb:

resources :products, only: [:index, :show] do 
    resources :orders, only: [:create] 
end 

resources :stocks, only: [:index, :show] do 
    resources :orders, only: [:create] 
end 

Rake Routen:

products_orders POST  /products/:product_id/orders(.:format) orders#create 
products_index GET  /products(.:format) products#index 
product GET  /products/:id(.:format) products#show 
stocks_orders POST  /stocks/:stock_id/orders(.:format) orders#create 
stocks_index GET  /stocks(.:format) stocks#index 
stock GET  /stock/:id(.:format) stocks#show 

Meine Models:

class Order < ApplicationRecord 
    belongs_to :product 
end 

class Product < ApplicationRecord 
    has_many :orders 
    has_many :stocks 
end 

class Stock < ApplicationRecord 
    belongs_to :product 
end 

Also tat ich dies:

class OrdersController < ApplicationController 
def create 
    if params[:product_id].present? 
     order.type = 'buy' 

    elsif params[:stock_id].present? 
     order.type = 'sell' 
    end 
end 
end 

Ist dieser Code sicher? Es gibt einen Weg, es besser zu machen? Ist es richtig, diesen Code auf params [: product_id] und params [: stock_id] zu verwenden?

if params[:product_id].present? 
    order.type = 'buy' 

elsif params[:stock_id].present? 
    order.type = 'sell' 
end 

Ist in irgendeiner Weise möglich, eine params in der Anfrage zu injizieren? Zum Beispiel inject params [: product_id] zu stoks/stock_id/orders, die etwas schaden? Zum Beispiel mit Curl. Vielen Dank.

+0

Duplikat von https://stackoverflow.com/questions/46993664/rails-create-action-with-if-else-based-on-paramsexample?rq=1 fragte y'day! –

Antwort

0

Ist in irgendeiner Weise möglich, eine params in der Anfrage zu injizieren? Zum Beispiel injizieren Sie params [: product_id] zu stoks/stock_id/orders, die etwas Schaden anrichten? Zum Beispiel mit curl

Ja. Nichts hält Sie davon ab, eine Anfrage an /stocks/123/orders?product_id=123 zu senden. Als Ergebnis wird params[:product_id] vorhanden sein und die Bestellung wird den falschen Typ erhalten.

Was ist mit dem Erstellen eines separaten Controllers für jede Art von Auftrag?

resources :products, only: [:index, :show] do 
    resources :product_orders, only: [:create] 
end 

resources :stocks, only: [:index, :show] do 
    resources :stock_orders, only: [:create] 
end 

Dann ProductOrdersController wird so einfach wie:

class ProductOrdersController < ApplicationController 
    def create 
    order.type = 'buy' 
    end 
end 

Dann StockOrdersController so etwas wie dies sein wird:

class StockOrdersController < ApplicationController 
    def create 
    order.type = 'sell' 
    end 
end 

Dies wird Ihnen helfen, auf params weitergegeben zu stoppen verlassen und loswerden der if Aussage.

+0

Vielen Dank Igor. In diesem Fall verwende ich das gleiche Order-Modell für zwei Controller, ist das richtig? – vreer

+0

Hängt von der Logik Ihrer App ab, aber ich nehme ja an –

+0

Ok. Ihrer Meinung nach ist es besser, nur ein Modell zu verwenden Bestellen oder zwei Modell StockOrder und ProductOrder erstellen? – vreer