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

Is there a way to pass a block to update_attributes?

我正在使用 Rails 4.2.1。我的 table 有一个高度列。有没有办法对用户传入的参数进行高度转换?类似于:

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 没有处理我试图传递的块。不知道为什么你不能将一个块传递给 update_attributes.

您应该在模型而不是控制器中执行此操作。使用虚拟属性,您可以确保设置 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 属性。