2010-02-08 5 views
2

J'ai une situation très commune et une solution, mais je voudrais demander aux experts de Rails si elle peut être améliorée.Rails: quelle est la manière "correcte" (idiomatique) de passer un paramètre de new à créer dans un contrôleur RESTful?

J'ai un contrôleur RESTful très typique où l'utilisateur fournit certains des attributs d'objet lors de la création. Il existe un modèle thing, un ThingsController et diverses vues, y compris new, create et un _form partiel.

Une chose a deux attributs,

  1. une couleur, qui est fixé quand ils ont frappé un lien pour le créer (par exemple un lien « Créer Red Thing » qui code l'ID de rouge comme une URL paramètre)
  2. une description, qui est entré par l'utilisateur sous la forme vue

Je suis satisfait de l'approche pour faire face à un attribut comme la THA description t qu'un utilisateur spécifie dans le formulaire, mais moins sûr de la façon dont je gère un attribut qui est transmis via les paramètres d'URL associés au premier clic.

C'est ce que je fais en ce moment (notez que j'ai omis la vérification d'erreur pour simplifier les choses). Tout d'abord, mes new et create méthodes dans le contrôleur sont les suivants:

def new 
    @thing = Thing.new 
    @thing.color = Color. find(params[:color]) 
end 

def create 
    @thing = Thing.new(params[:thing]) 
    @thing.color = Color. find(params[:color]) 

    if @thing.save 
    flash[:notice] = "Successfully created thing." 
    redirect_to somewhere_url 
    else 
    render :action => 'new' 
    end 
end 

La vue new invoque juste la partie, _form qui se présente comme suit:

<% form_for @thing do |f| %> 
    <%= f.error_messages %> 

    <%= hidden_field_tag "color", @thing.color.id %> 

    <%= f.label :description %> 
    <%= f.text_area :description %> 
    <%= f.submit "Submit" %> 
<% end %> 

Il semble un peu désordonné à passer l'ID de couleur jusqu'à la méthode create en tant que paramètre d'URL en plaçant un champ masqué dans le formulaire. Cela semble-t-il raisonnable, ou y a-t-il une autre approche qui serait meilleure?

Répondre

3

Normalement dans cette situation, je voudrais mettre un champ caché dans le formulaire, qui tiendra le color_id. La bonne chose à propos de cette façon est que vous pouvez vous contenter de définir la couleur de l'objet avant de rendre le formulaire. Donc, vos changements de contrôleur à:

def new 
    @thing = Thing.new 
    @thing.color = Color. find(params[:color]) 
end 

def create 
    @thing = Thing.new(params[:thing]) 
    if @thing.save 
    flash[:notice] = "Successfully created thing." 
    redirect_to somewhere_url 
    else 
    render :action => 'new' 
    end 
end 

et votre formulaire changeront pour

<% form_for @thing do |f| %> 
    <%= f.error_messages %> 

    <%= f.hidden_field :color_id %> 

    <%= f.label :description %> 
    <%= f.text_area :description %> 
    <%= f.submit "Submit" %> 
<% end %> 

La couleur est ensuite passée à travers les deux formes, et il vous suffit de récupérer la couleur dans la première forme. (N'oubliez pas d'ajouter des validations à votre modèle Thing pour vous assurer qu'il a bien une couleur valide).

+0

Merci beaucoup jamuraa. C'est beaucoup plus propre. – Greg

Questions connexes