Forum: Ruby on Rails validation help please

Posted by Dave Castellano (dcastellano1)
on 2013-03-01 14:20
Hi,

Can anyone take a look at this....  i've been banging my head on the
wall for several days trying to figure this out. The validation is
bypassed as it seems its not evaluating :question_type == "standard"  to
true in the model.

Model:
validates :question_type,     :presence  => true
    if :question_type == "standard"
      validates :question,        :presence   => true
    ...

Controller:
def create
    @question = Question.new(params[:question])
  if @question.save
          if @question.question_type == "standard"
            flash[:success] = "Question created!"
            redirect_to @question
          else
            .....

new.html.erb:
<%= f.submit 'Save', question_type: "standard" ...
Posted by Colin Law (Guest)
on 2013-03-01 14:35
(Received via mailing list)
On 1 March 2013 13:20, Dave Castellano <lists@ruby-forum.com> wrote:
>       validates :question,        :presence   => true
Is that code just inline in the model?  If so then it is only executed
once, when the code is loaded, so the if statement is not tested for
each object being validated.  Have a look at the Rails Guide on
ActiveRecord Validations and Callbacks to see ways that you can
accomplish what you want.

Colin
Posted by Walther Diechmann (walt)
on 2013-03-01 14:47
(Received via mailing list)
Hi Dave,

I believe you should do something along the lines of

Model:

  validates_each :question do |record, attr, value|
    record.errors.add attr, 'The question is not present!?' if 
value.blank? and record.question_type=="standard"
  end

plz correct me if I'm wrong, Colin :)

cheers,
Walther


Den 01/03/2013 kl. 14.20 skrev Dave Castellano <lists@ruby-forum.com>:
Posted by Colin Law (Guest)
on 2013-03-01 14:55
(Received via mailing list)
On 1 March 2013 13:46, Walther Diechmann <walther@diechmann.net> wrote:
> plz correct me if I'm wrong, Colin :)
It might be easier to use :if

Colin
Posted by Frederick Cheung (Guest)
on 2013-03-01 15:17
(Received via mailing list)
On Friday, March 1, 2013 1:20:24 PM UTC, Ruby-Forum.com User wrote:
>     if :question_type == "standard"
>       validates :question,        :presence   => true
>     ...
>
> This code is evaluated when the model is loaded. It compares the symbol
:question_type to the string 'standard' (which are of course never 
equal)
and so doesn't add the validation.
You want the choice of whether to apply the validation or not to be 
taken
when the model is about to be validated. The standard way of doing that 
is
with the :if option

validates :question_type,     :presence  => true
validates :question,        :presence   => true, :if => 
:standard_question?

will call the standard_question? method and only enforce the presence
validation on question if the method returns true. There is also a 
lambda
form

validates :question,        :presence   => true, :if => lambda {|record|
record.question_type == 'standard'}

Fred
Posted by Dave Castellano (dcastellano1)
on 2013-03-01 15:53
Ok,

Thank you.  I read Rails Guide on ActiveRecord Validations and 
Callbacks, specifically Conditional Validation.

So,
validates :question, :presence   => true,  :if => "question_type.blank?" 
placed inline in model should be the simplest way to do this. It does 
not work however.  My lack of understanding seems to be related to how I 
specify question_type in the condition?

As you can see i'm still on the bottom of the steep part of the learning 
curve.'

Thanks for the help
Posted by Dave Castellano (dcastellano1)
on 2013-03-01 15:58
Frederick Cheung wrote in post #1099720:
> On Friday, March 1, 2013 1:20:24 PM UTC, Ruby-Forum.com User wrote:
>>     if :question_type == "standard"
>>       validates :question,        :presence   => true
>>     ...

> with the :if option
>
> validates :question_type,     :presence  => true
> validates :question,        :presence   => true, :if =>
> :standard_question?
>
> will call the standard_question? method and only enforce the presence
> validation on question if the method returns true. There is also a
> lambda
> form
>
> validates :question,        :presence   => true, :if => lambda {|record|
> record.question_type == 'standard'}
>
> Fred

Thanks Fred,
Got this error
undefined method `standard_question?' for #<Question:0x007f947ddb2e00>
Do I need to write a  standard_question method

(I'm beginner)
Posted by Dave Castellano (dcastellano1)
on 2013-03-01 16:05
Lambda method works, although I don't understand it :-)

Thanks!!

Dave
Posted by Frederick Cheung (Guest)
on 2013-03-01 16:36
(Received via mailing list)
On Friday, March 1, 2013 2:58:53 PM UTC, Ruby-Forum.com User wrote:
> > form
>
> Yes - it's up to you to write a standard_question? method. The lambda
saves you having to have the condition in a separate method but can make
your validation look more cluttered (especially for more complicated
conditions).

Fred
Posted by Dave Castellano (dcastellano1)
on 2013-03-01 17:13
Thanks again,

Is there a way to add a message if validation fails using lambda method 
(I am using Lambda method until I can figure out why
validates :question,        :presence   => true, :if 
=>:standard_question?
generates
undefined method `standard_question?' for #<Question:0x007f947ddb2e00>)
Posted by Jodi S. (jodi_s)
on 2013-03-01 17:39
(Received via mailing list)
Dave,  you have to add an instance method "standard_question?" to your 
model

def standard_question?
end

from the url below you can see that you can pass a :message param to
customize the error message

http://guides.rubyonrails.org/active_record_valida...
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.