14 votes

Comment passer des valeurs arbitraires (non attribut de modèle) à une action rails ?

J'ai un modèle de relation unidirectionnelle entre utilisateurs (les utilisateurs ont plusieurs relations) qui contient les identifiants de deux utilisateurs donnés ainsi que le surnom de l'utilisateur a pour l'utilisateur b. Je veux utiliser un formulaire pour permettre aux utilisateurs de saisir l'adresse e-mail d'un autre utilisateur et le surnom. Si un utilisateur avec cette adresse e-mail existe, alors une relation est créée entre les utilisateurs. Si aucun utilisateur ne correspond, créez un nouvel utilisateur "fantôme" avec cette adresse électronique, puis établissez la relation.

Je suis relativement nouveau dans le domaine des rails, et j'ai d'abord essayé naïvement d'utiliser la version de base :

= form_for @relationship do |f|
    = f.label :email
    = f.text_field :email
    = f.label :nickname, "Nickname"
    = f.text_field :nickname
    = f.submit "Submit", class: "btn btn-large btn-primary"

Cette opération échoue car le modèle de relation ne contient pas d'attribut email. J'ai alors essayé ce qui suit, en pensant que cela pourrait fonctionner parce qu'il n'y avait pas de référence directe au modèle de relation.

= form_tag :controller => "relationships", :action => "create" do
    = label :email        
    = text_field :email
    = label :nickname, "Nickname"
    = text_field :nickname
    = submit "Submit", class: "btn btn-large btn-primary"

Mais cela jette une erreur "mauvais nombre d'arguments (1 pour 2)".

Je pourrais ajouter un champ email au modèle de relation, mais il n'est pas nécessaire, sauf lorsque je l'utilise pour rechercher l'utilisateur souhaité. J'avais prévu d'utiliser les valeurs de l'email et du pseudo transmises à l'action create du contrôleur de relation pour créer la relation ou créer un nouvel utilisateur, puis la relation, selon le cas. Alors, comment puis-je transmettre des valeurs arbitraires à une action de contrôleur ?

16voto

Trip Points 9846

Utilisez la première forme, et faites simplement un attr_accessor dans votre modèle l'attribut email.

Il s'agit en fait d'une variable temporaire que vous pouvez dériver d'un formulaire, par exemple, mais qui ne sera pas enregistrée dans la base de données.

class Relationship < ActiveRecord::Base # <- Assuming that's the name of your Relationship model

  attr_accessor :email

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X