2017-10-29 134 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