有没有办法将块传递给update_attributes?

时间:2015-05-04 16:26:13

标签: ruby-on-rails ruby-on-rails-4 strong-parameters

我使用的是Rails 4.2.1。我的桌子有一个高度栏。有没有办法在用户传递的参数上进行高度转换?类似的东西:

class WhateverController < ApplicationController
  def update
    current_user.update_attributes(user_params) do |u|
      u.height = convert_height_from_feet_to_inches
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :height_feet, :height_inches, :weight)
    end

    def convert_height_from_feet_to_inches
      (user_params[:height_feet] * 12) + user_params[:height_inches]
    end

end

由于某种原因,update_attributes没有处理块I尝试传递它。不确定为什么你不能将一个块传递给update_attributes。

1 个答案:

答案 0 :(得分:2)

您应该在模型中执行此操作,而不是控制器。使用虚拟属性,您可以确保设置height_feetheight_inches将使用正确的值更新height,反之亦然:

class User < ActiveRecord::Base
  attr_reader :height_feet, :height_inches

  def height_feet=(feet)
    @height_feet = feet.present? ? feet.to_i : feet
    assign_height_from_feet_inches!
  end

  def height_inches=(inches)
    @height_inches = inches.present? ? inches.to_i : inches
    assign_height_from_feet_inches!
  end

  def height=(inches)
    self.height_feet, self.height_inches = inches.divmod(12)
  end

  private
  def assign_height_from_feet_inches!
    self[:height] =
      if self.height_feet.nil? || self.height_inches.nil?
        nil
      else
        self.height_feet * 12 + self.height_inches
      end
  end
end

现在在控制器中你可以这样做,其余的将自动发生:

current_user.update_attributes(user_params)

这将导致每次保存记录时自动计算height属性。