2011-02-04 2 views
1

J'ai parcouru la documentation pour obtenir ActiveRecord validation fonctionnant avec ActiveModel. Pour une raison quelconque, je ne vois aucun résultat de validation retourné.Validation de Rails avec ActiveModel

J'ai un ensemble de modèles qui, au lieu d'interfaçage avec ActiveRecord, s'interfaçent via une API personnalisée qui sera installée derrière Rails.

Le modèle:

class ApiObject < ApiConnector 
    include ActiveModel::Validations 
    attr_accessor :fieldName 

    validates :fieldName, :presence => true 
    def save 
    #save method implementation 
    end 
end 

Le contrôleur:

def create 
    @apiObject = ApiObject.new(params[:api_object]) 

    respond_to do |format| 
    if @apiObject.save 
     format.html { redirect_to(@apiObject, :notice => 'User was successfully created.') } 
     format.xml { render :xml => @apiObject, :status => :created, :location => @apiObject } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @apiObject.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

Le formulaire:

<%= form_for :api_object, :url => '/apiobjectcontroller/' do |f| %> 
    <%= f.label :fieldName, 'Field Name' %> 
    <%= f.text_field :fieldName %> 
    <%= f.submit 'Create'%> 
<% end %> 

Je suit le code Disposées ici: Rails ActiveModel Validation

La méthode retourne correctement au formulaire car @ apiObject.save renvoie false, mais aucune réponse de validation ne revient. J'ai vérifié le balisage et les résultats habituels de validation des rails ne sont pas retournés. Qu'est-ce que je rate?

Répondre

2

Cela devrait pleinement répondre:

http://asciicasts.com/episodes/211-validations-in-rails-3

En bref: créer votre formulaire avec une variable d'instance + ajouter le code nécessaire pour afficher vos erreurs.

+0

J'ai ajouté les deux et je ne reçois toujours rien quand il revient. La collection d'erreurs est vide. –

+2

La collection d'erreurs est seulement remplie lorsqu'elle est valide? est appelé. Peut-être que vous devez appeler manuellement valide? – Scott

+0

Merci Scott qui a travaillé. Après avoir modifié le formulaire pour utiliser une variable d'instance, je devais ajouter un appel à valide? Apparemment, il n'était pas mentionné dans la documentation sur la validation ActiveModel. Heureusement, cela fonctionne maintenant. –

5

J'ai un code similaire qui fonctionne, mais j'ai une méthode initialize dans mes classes. Peut-être votre modèle devrait être:

class ApiObject < ApiConnector 
    include ActiveModel::Validations 

    validates :fieldName, :presence => true 

    attr_accessor :fieldName 

    def initialize(fieldName) 
    @first_name = fieldName 
    end 

    def save 
    return false unless valid? 
    # save method implementation to go here 
    # ... 
    true # if save successful, otherwise, false 
    end 
end 

Si les travaux ci-dessus, et vous finissez par avoir beaucoup d'attributs pour assigner dans votre initialiseur, vous pouvez utiliser ce vieux truc:

def initialize(attributes = {}) 
    attributes.each do |name, value| 
    instance_variable_set "@#{name}", value 
    end 
end 

EDIT: Ajout d'un appel à valide? enregistrez l'implémentation, afin que la collecte des erreurs soit complétée.

+0

Je ne pense pas que le problème réside dans la partie validation de son code. – apneadiving

+0

Wow, on dirait que nous avons fait du travail en équipe, +1 alors;) – apneadiving

+0

Merci! High fives à l'équipe! :-) – Scott

Questions connexes