0

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

我尝试在模型中执行此操作,称为“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 控制器的创建操作中的以下内容

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 属性,并且双 if then 语句看起来很新奇 :P。

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

4

1 回答 1

0

我认为您混淆了“控制器”和“模型”之间的界限。控制器对您编写的模型内部的验证一无所知。FindNumbersController控制器被调用和模型被调用这一事实FindNumber在共享功能方面并没有任何意义。

您需要使用传入的参数显式创建模型的实例,并让模型对实例执行验证

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?

于 2012-10-03T19:32:42.000 回答