Ce code est fourni à titre d'exemple à utiliser avec le Devise et Omniauth, il fonctionne dans Mon projet .
class User < ActiveRecord::Base def self.new_with_session(params, session) super.tap do |user| if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] user.email = data["email"] if user.email.blank? end end end end
4 Réponses :
dans Ruby, un seul signe égal est utilisé pour affectation em>. L'expression attribue le résultat de l'évaluation de la session si la session si le Si la condition est en vérité, la clause Remarque: Je pense que l'on pourrait également utiliser la variable code> de données code> dans le côté droit de l'opérateur mais je vais devoir vérifier cela. p> p> ["devise.facebook_data"] code> à une variable locale nommée
data p >
code> hachage n'a pas de
"devise.facebook_data" clé code>, il retournera
nil code> et
données code> sera attribué
nil code>. Les affectations évaluent à la valeur étant attribuée, la mission évaluera donc à
nil code> aussi.
NIL CODE> est considéré comme un faux dans un contexte booléen, de sorte que le bon opérancier du
&& code> ne sera pas évalué. De cette façon, vous n'obtiendrez pas un
nométhoderror tentative d'appeler
nil ["extra"] ["Raw_info"] code>. P>
SESSION CODE> HASH Est-ce que EM> a un
"" devise.facebook_data " code> clé,
data code> sera défini sur la valeur associée à celle-ci. Toute valeur autre que
nil code> et
false code> est considérée comme une vérité, donc l'opérande de droite de l'opérateur
&& code> sera évalué. P>
code> sera évaluée, qui utilise la variable code> DATA CODE> attribué à la condition. P>
&& code>, c'est-à-dire que la condition pourrait lire comme ceci à la place: p> < Pré> xxx pré>
Oui, c'est ce que je pensais, je suppose que je suis juste confondu par la mise en page de la fonction. Pourriez-vous éventuellement expliquer ce que c'est exactement demandé? Je vois le &&, mais il semble que ça va plus que ça?
Le premier si code> est équivalent à
data = ... code> suivi de
si des données; utilisateur.email = ... code>.
Un opérateur d'affectation ( = code>) renvoie la valeur attribuée, qui est ensuite évaluée par le
si code>. En rubis, seul
faux code> et
nil code> est considéré comme
faux code>. Tout le reste évalue à
true code> dans un contexte booléen (comme un
si code>). P>
Ruby ne se soucie pas des types de conditionnels, contrairement à Java. Tant que la valeur n'est ni née ni fausse, elle passera. P>
Dans votre exemple, vous discriminez-vous réellement contre NIL: le si subordonné que les données n'existent pas et ne sont pas nulles, nous pouvons donc l'utiliser, en supposant que c'est un hachage. Ceci est un modèle commun dans Ruby. P>
En réalité, une valeur est faluée ou non est déterminée par son type (classe) b>, c'est-à-dire s'il s'agit d'une instance de nilclass code> ou
falseclass code>, alors c'est falueux.
La seule chose nécessaire à un intelligy a un Bon point pour déposer une plainte sur le code comme celui-ci, car il est difficile de lire sans connaître une chose ou deux sur Ruby. Une recommandation serait de le déplacer à une déclaration d'affectation explicite à la place. Cela a l'avantage supplémentaire de sécher une référence à deux fois. P> si code> instruction à être valide est une expression booléenne. Dans ce cas, étant donné que
= code> renvoie le résultat de la mission, ce qui est réellement testé est la falsification de la session
["devise.facebook_data"] code>.
Merci!! A du sens maintenant, vous avez expliqué cela parfaitement.
Je ne sais pas ce que vous entendez par "chose nécessaire ... être valide est une expression booléenne". Tout objet peut apparaître après si code>. Existe-t-il un objet "non booléen" que vous avez à l'esprit que vous feriez un
si code> condition illégale?
@sawa quand je suis près d'une machine, je peux réviser cette partie.