2017-10-29 133 views
-2

我有一個控制器訂單。該控制器根據POST請求執行不同的操作。 當用戶購買產品時,它會轉到他的庫存。所以只有庫存的產品纔可以銷售。庫存表有一個product_id列。簡單地說,當一個用戶在產品/ product_id頁面上的訂單必須是買入的時候,在stock/stock_id頁面上的訂單必須是賣出的。Ruby on Rails:If Else based on params [:example]

的routes.rb:

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

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

耙路線:

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 

我的模型:

class Order < ApplicationRecord 
    belongs_to :product 
end 

class Product < ApplicationRecord 
    has_many :orders 
    has_many :stocks 
end 

class Stock < ApplicationRecord 
    belongs_to :product 
end 

所以我這樣做:

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

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

該代碼是否可靠?有辦法做得更好嗎? 基於params [:product_id]和params [:stock_id]使用此代碼是否正確?

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

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

可能以某種方式注入的請求PARAMS? 例如將params [:product_id]注入stoks/stock_id/orders會造成一些損害?以捲曲爲例。 非常感謝。

+0

重複的https://stackoverflow.com/questions/46993664/rails-create-action-with-if-else-based-on-paramsexample?rq=1問問你好! –

回答

0

可能以某種方式在請求中注入參數?例如,注入params [:product_id]給stoks/stock_id/orders會造成一些損害?例如捲曲

是的。沒有什麼能阻止你發送請求到/stocks/123/orders?product_id=123。結果params[:product_id]即將出現,訂單將收到錯誤的類型。

如何爲每種訂單創建單獨的控制器?

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

然後StockOrdersController將是這樣的:

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

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

然後ProductOrdersController會是簡單

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

這將幫助你停止依靠通過params和擺脫if聲明。

+0

非常感謝伊戈爾。所以在這種情況下,我對兩個控制器使用相同的Order模型,是嗎? – vreer

+0

取決於你的應用的邏輯,但我認爲是 –

+0

好的。您認爲最好只使用一個模型訂單或創建兩個模型StockOrder和ProductOrder? – vreer