I have two fields in a form I would like to validate the presence of, before sending. The problem though is that the controller’s model doesn’t have these fields in the database, so I tried making virtual attributes. I’m not quite sure how to get it to work though.
I tried doing this in the Model, called “Find_number”
class FindNumber < ActiveRecord::Base
attr_accessor :name
attr_accessor :original_number
validates :name, presence: true
validates :original_number, presence: true
end
and the following in the create action of the Find_numbers controller
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
When I enter info though, I get the error
undefined method `valid?' for :name:Symbol
I’m probably calling the :name and :original_number attributes incorrectly, and the double if then statements look very newbish :P.
What would I need to replace if :name.valid? && :original_number.errors.any? , to make sure that it validates? Or is there a lot more I’m missing?
I think you are confusing the boundary between ‘controller’ and ‘model’. The controller doesn’t know anything about the validations inside of the model that you’ve written. The fact that the controller is called
FindNumbersControllerand the model is calledFindNumberdoesn’t really mean anything in terms of shared functionality.You would need to explicitly create an instance of the model with the passed in params, and let the model perform the validation on the instance
Then you can ask whether the instance as a whole is valid
or whether a specific field has any error messages
So,
:name.valid?becomesfind_number.errors[:name].empty?and:original_number.errors.any?becomesfind_number.errors[:original_number].any?