新手问题 Rails Model 保存或者更新的时候针对个别字段特殊处理怎么写方便

dddx · 2016年04月12日 · 最后由 dddx 回复于 2016年04月14日 · 2832 次阅读

比如 ...

def create
    @prodcut = Prodcut.new
    @prodcut.name = product_params[:name]
    @prodcut.price = product_params[:price] * 2  #因为这一行
    @prodcut.color = product_params[:color]
    @prodcut.buyer = product_params[:buyer]
    ...
    #(如果有更多我会一个个去写 累觉不爱)
    if @prodcut.save
    ...
    else
    ...
    end
end 

教程都是直接

@product.update(product_params)

就好 请问如何让它简单一点 (问题核心是简洁)

product_params.merge(price: product_params.fetch(:price) * 2)

如果特殊并且通用的逻辑,可以实现 price= 方法:

class Prodcut

  def price=(value)
    self[:price] = value * 2
  end
end

然后 Controller 那里就可以直接:

@product.update(product_params)

来更新了

@product.update(**product_params, price: product_params[:price] *2)

注意顺序

#3 楼 @mizuhashi **product_params这里连续两个星号是什么用法,还没这么用过。

#1 楼 @watraludru 你这个方法我试了,着实可行 赞 要这么用 @product.update(product_params.merge(price: product_params.fetch(:price) * 2))

#2 楼 @zlx_star 这个 class Prodcut 是 class ProductsController < ApplicationController 么,或者写在哪,好像是没起作用,求指点....或许我没有用对

幸好没有@product这么仁兄,要不得郁闷倒在厕所

#5 楼 @qinfanpeng **展开 hash,*展开 array,ruby2 引入,一起引入的还有def t(a: 1),也算解构赋值了,这些可以组合使用 def t(a, *arr, b: 1, **hsh)

#10 楼 @mizuhashi 不错,感觉*之于 Hash,就相当于之于 Array。

发现有时候思维就是卡住,我自己想到一个办法,感觉比以上都简单.... 这个方法呢,我没有试,但我感觉一定行 (只是感觉哦...试试了后我来更新)

def create
  @product = Product.new(product_params)
  @product.price *= 2 
  if @product.save
    ...
  else
    ...
  end
end

#8 楼 @dddx 呃,这是 Product 模型的方法

#13 楼 @zlx_star 看了你的资料,才发现世界很小,我 也姓祝...字辈:瑞映山庄,和 (河) 东风起,厚德呈祥 我在 [风]

def price_double
  price * 2
end

#16 楼 @rei 这样确实简洁 不过.... 能这样使用不 @product.update(product_params)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号