1

一些背景知识:我有一个带有小数列的 Rails 4 模型d。在应用程序中保存或查看时,可能需要根据当前用户的偏好将值分别转换为整数值或从整数值转换。

计算应该进入模型似乎最合适,并且不应该了解用户。

在进行了一些搜索之后,在我看来,实现这一目标的最佳方法是通过模型上的 2 个虚拟属性:一个用于当前用户的首选格式,一个用于值,应用任何计算。

所以我想出了这样的事情:

attr_accessor :format, :value_converted

def value_converted
  if format.nil?
    format = 'A'
  end
  if format == 'A'
    Converter.new(d).to_i if d
  else
    d if d
  end
end

def value_converted=(value)
  if format.nil?
    format = 'A'
  end
  if format == 'A'
    self.d = Converter.new(value.to_i).to_f
  else
    self.d = value
  end

表单是指value_converted而不是d,这适用于编辑、更新和查看。问题是#create行动。

我相信这个问题正在发生,因为 setter 正在访问format,而且我似乎无法在调用 setter 之前找到一种设置方法format#create换句话说,当new创建对象时。

我想也许我可以将它format与其他参数一起传递(如在这个答案中,所以我尝试在标准强参数票价之内和之后将它合并,但没有运气:

两个都

@entry = current_user.entries.new(entry_params.merge(format: current_user.format))

params.require(:entry).permit(:value_converted, :other_param, ...).merge(format: current_user.format)

不要引发任何错误,但显然会被忽略。但是,只需在控制台中传递formatto就可以了。new

所以我的问题是:有没有人可以解决这个问题?或者也许是更好/更合适的方式?看起来应该很简单。

谢谢你的帮助

4

1 回答 1

1

目前,我通过在保存之前简单地在控制器中设置formatand的值来解决这个问题:value_converted

def create
  @entry = current_user.entries.new(entry_params)
  @entry.format = current_user.format
  @entry.value_converted = entry_params[:value_converted]
  if @entry.save
  ...
end

尽管这可能不是最优雅的解决方案(我不知道我的实现是否是线程安全的),但它似乎确实有效。

于 2013-08-20T22:20:22.410 回答