在Rails控制器中重构记录检索

时间:2017-02-15 15:40:38

标签: ruby ruby-on-rails-4 refactoring

enter image description here

我有上面的代码和以下路线' s SELECT CUST_NUMBER, REFNUMBER, 'Application No Longer Exists; ' as Exception from Data except select CUST_NUMBER from applications

resources

我是否知道#4和#9中的代码是否可以重构,因为他们正在做同样的事情,而且我已经读过Ruby中的编程总是鼓励DRY代码。在这里学习成为更好的程序员。感谢您的提示和建议。

2 个答案:

答案 0 :(得分: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呈现的形式呈现的。
  3. 如果这些更改不适合您的应用程序,请随意丢弃。

答案 1 :(得分:0)

是的,您可以将其添加到before_action并从newcreate操作中删除

现在@product将在newcreate操作

之前分配
before_action :find_product, only: [:new, :create]

private

def find_product
  @product = Product.find(params[:product_id])
end