我上面的代碼和下面的路線的resources
:
resources :products, only:[:index] do
resources :orders, :path => 'order', only:[:new, :create],
path_names: {new: ""}
end
我想知道,如果在#4和#代碼,因爲他們」 9可重構重做同樣的事情,我讀過Ruby中的編程總是鼓勵DRY代碼。學習在這裏成爲一個更好的程序員。感謝您的提示和建議。
我上面的代碼和下面的路線的resources
:
resources :products, only:[:index] do
resources :orders, :path => 'order', only:[:new, :create],
path_names: {new: ""}
end
我想知道,如果在#4和#代碼,因爲他們」 9可重構重做同樣的事情,我讀過Ruby中的編程總是鼓勵DRY代碼。學習在這裏成爲一個更好的程序員。感謝您的提示和建議。
是的,你可以把它添加到before_action
和new
和create
行動
現在@product
刪除之前new
和create
行動
before_action :find_product, only: [:new, :create]
private
def find_product
@product = Product.find(params[:product_id])
end
如迪帕克提到的將被分配,before_action
是一個想法。就個人而言,我更喜歡懶惰的訪問者。它的優點是:
order
,則自動加載product
,無需手動加載。代碼應該是這樣的:
def new
product
end
def create
if order.save
redirect_to(products_path)
else
render(:new)
end
end
private
def product
@product ||= Product.find(params[:product_id])
end
def order
@order ||= product.orders.build(order_params)
end
請注意,我做了兩個小的變化(你可以擺脫):
order.save
是否返回真值。new.html.erb
。如果它們不適合您的應用程序,請隨時放棄這些更改。
好方法,儘管在'new'中調用'product'不是很具描述性。我會考慮在product的定義下面添加'alias:set_product:product' – fylooi
請添加代碼片段而不是圖片 –