Ruby on rails 验证隐藏字段数据

Ruby on rails 验证隐藏字段数据,ruby-on-rails,Ruby On Rails,我有一个需要城市id、州id和国家id的用户模型。我没有在用户的个人资料中询问每个城市id、州id和国家id,而是采用了更现代的方式,添加了一个位置自动完成。当用户选择自动完成选项时,我将城市id存储在表单的隐藏字段中。提交表单时,我希望确保该城市在我的城市表中是有效的城市。现在,我的用户控制器中有这个逻辑。我是这样做的: def update # I override the strong parameters here so I can add / remove them if I

我有一个需要城市id、州id和国家id的用户模型。我没有在用户的个人资料中询问每个城市id、州id和国家id,而是采用了更现代的方式,添加了一个位置自动完成。当用户选择自动完成选项时,我将城市id存储在表单的隐藏字段中。提交表单时,我希望确保该城市在我的城市表中是有效的城市。现在,我的用户控制器中有这个逻辑。我是这样做的:

def update
    # I override the strong parameters here so I can add / remove them if I
    # need to.
    @user_params = user_params
    if @user_params[:city_id]
        @city = City.find_by id: @user_params[:city_id]
        if @city.present?
            @user_params[:city_id] = @city.id
            @user_params[:state_id] = @city.state.id
            @user_params[:country_id] = @city.country.id
        else
            # Here I'd like to tell the user they submitted an invalid location
            # rather than invalid city, state, country. I don't believe
            # I can add custom validation errors in the controller though.
        end
    end
    # Update the user, etc.
end
所以我想有几个问题我对Rails还是相当陌生的:

为了可重用性,我应该把这个逻辑放在哪里? 这是我想要实现的目标的正确方法吗? 如何将一组验证(如城市id、州id、国家id)放入一个验证(如:无效位置)中。
因此,删除这些内容后,您只需验证城市的存在,而不是城市id-


如果你能通过城市,为什么你需要设定州和国家?@japed是的,我今天在上班的路上想了想,我会删除那些州id,国家id。但是问题仍然应该适用。对,现在这是有意义的。谢谢还有其他问题吗?它们有点大。因为现在是一个模型验证,如果@user.updateuser_paramso如果有人用无效的id修改隐藏的city_id字段,那么验证会得到它吗?我不必检查它是否有效吗?我之所以问这个问题,是因为如果用户选择输入数据,我可能只需要验证字段。否则,它不是模型所必需的。模型上没有字段吗?我将使用attr_访问器,然后在自定义验证方法中将错误添加到模型中
class User
  validates :city, presence: { message: "Location is invalid" }
end