我使用的是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。
答案 0 :(得分:2)
您应该在模型中执行此操作,而不是控制器。使用虚拟属性,您可以确保设置height_feet
或height_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
属性。