2017-02-15 8 views
0

enter image description hereРефакторинга в контроллере Rails

У меня есть код выше и следующий маршрут resources:

resources :products, only:[:index] do 
    resources :orders, :path => 'order', only:[:new, :create], 
    path_names: {new: ""} 
end 

Может ли я знать, если код в # 4 и # 9 могут быть переработаны, так как они» делаю то же самое, и я читал, что программирование в Ruby всегда поощряет DRY-код. Научиться быть лучшим программистом здесь. Спасибо за советы и советы.

+0

Пожалуйста, добавьте фрагменты кода вместо изображения –

ответ

0

Да, вы можете добавить его в 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 
1

Как уже упоминалось Дипак, 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 

Обратите внимание, что я сделал два незначительных изменений (которые вы можете избавиться от):

  1. Я строю заказ (вместо того, чтобы создавать его) и проверьте, возвращает ли order.save правдивое значение.
  2. Я не пропускаю ошибки во вспышке. Я предполагаю, что они отображаются в форме, созданной new.html.erb.

Не стесняйтесь отказаться от этих изменений, если они не соответствуют вашему приложению.

+1

Приятный подход, хотя вызов просто 'product' в' new' не очень описателен. Я хотел бы добавить «псевдоним: set_product: product» под определением 'product' – fylooi

Смежные вопросы