validation表单中的虚拟属性:未定义的方法“有效吗?” for:name:Symbol

在发送之前,我想要validation存在的forms有两个字段。 但问题是控制器的模型在数据库中没有这些字段,所以我尝试制作虚拟属性。 我不太确定如何让它工作。

我尝试在模型中执行此操作,称为“Find_number”

class FindNumber < ActiveRecord::Base attr_accessor :name attr_accessor :original_number validates :name, presence: true validates :original_number, presence: true end 

以及Find_numbers控制器的create动作中的以下内容

 def create @user = current_user client = Twilio::REST::Client.new(@user.twilio_account_sid, @user.twilio_auth_token) search_params = {} %w[in_postal_code near_number contains].each do |p| search_params[p] = params[p] unless params[p].nil? || params[p].empty? end local_numbers = client.account.available_phone_numbers.get('US').local @numbers = local_numbers.list(search_params) if :name.valid? && :original_number.errors.any? unless @numbers.empty? render 'find_numbers/show' else flash.now[:error] = "Sorry, We Couldn't Find Any Numbers That Matched Your Search! Maybe Something Simpler?" render 'find_numbers/new' end else flash.now[:error] = "Sorry, We Couldn't Find Any Numbers That Matched Your Search! Maybe Something Simpler?" render 'find_numbers/new' end end 

当我输入信息时,我收到错误

 undefined method `valid?' for :name:Symbol 

我可能错误地调用了:name和:original_number属性,而double if语句看起来非常新鲜:P。

如果:name.valid,我需要替换什么? &&:original_number.errors.any? ,以确保它validation? 或者还有更多我想念的?

我认为你混淆了’控制器’和’模型’之间的界限。 控制器对您编写的模型内部的validation一无所知。 控制器名为FindNumbersController并且模型名为FindNumber这一事实在共享function方面并不具有任何意义。

您需要使用传入的参数显式创建模型的实例,并让模型在实例上执行validation

 find_number = FindNumber.new(params.slice(:name, :original_number)) 

然后,您可以询问整个实例是否有效

 find_number.valid? 

或者特定字段是否有任何错误消息

 find_number.errors[:field].any? 

那么, :name.valid? 成为find_number.errors[:name].empty?:original_number.errors.any? 变成find_number.errors[:original_number].any?