La difficulté sur l'affichage d'un modèle de passer une variable locale
Je suis en cours d'exécution Ruby on Rails 3 et je voudrais rendre un template (show.html.erb
) en passant une variable locale.
Dans RAILS_ROOT/views/users/show.html.erb
j'ai
Name: <%= @user.name %>
Surname: <%= @user.surname %>
J'ai également un contrôleur de la page pour gérer les pages et les application_controller.rb
un istance de @current_user
. Une page est appelée user
, donc dans RAILS_ROOT/views/pages/user.html.erb
j'ai
<%= render :template => "users/show", :locals => { :user => @current_user } %>
Le code ci-dessus ne fonctionne pas (j'ai cette erreur: RuntimeError in Pages#user, Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
) mais cela fonctionne:
<%= render :template => "users/show", :locals => { :user => @user = @current_user } %>
Je pense que c'est pas une bonne approche à "écraser" le @user
variable. C'est parce que, par exemple, si j'ai besoin de rappeler @user
après le 'rendu' instruction, elle ne fonctionne plus.
Alors, qu'est ce qu'une solution afin de rendre show.html.erb
?
J'ai essayé aussi
<%= render :template => "users/show", :locals => { @user => @current_user } %>
<%= render :template => "users/show", :locals => { :object => @current_user, :as => @user }
mais ceux-ci ne fonctionnent pas.
Mise à JOUR
Si dans pages_controller.rb
j'ai mis ce
def user
@user ||= @current_user
end
de sa mise en œuvre dans la vue fichiers, vous pouvez utiliser
<%= render :template => "users/show" %>
De toute façon, j'ai découvert que j'ai cette erreur (voir ci-dessous pour plus d'infos):
ActionController::RoutingError in Pages#user
No route matches {:action=>"destroy", :controller=>"users"}
L'erreur est généré à partir de ce forme déclaration situé dans un partiel chargé de show.html.erb
:
<%= form_for(@user, :url => user_path) do |f| %>
...
<% end %>
OriginalL'auteur user502052 | 2011-02-16
Vous devez vous connecter pour publier un commentaire.
et dans le modèle de
Locales les variables sont locales, de sorte que vous n'avez pas besoin
@
de les renvoyer.@user502052
Vous pouvez effectuer le rendu de la vue explicitement à partir de votre contrôleur.
Lorsque vous n'avez pas exécuter
render
dans le contrôleur, le cadre n'est que pour vous avec les paramètres par défaut. Lorsque vous le faites, vous pouvez spécifier différentes fichier de modèle, de transmettre des variables locales, rendu partiel: rienrender
fonction prend en charge.@user
(autres contrôleurs dépendent de la déclaration@user
), j'ai besoin d'utiliser ce "format".est une variable globale, vous ne pouvez pas localiser". Je suggère de passer des variables locales à partir de votre contrôleur de la même manière.
Dans l'ordre à l'aide de
@user
au lieu deuser
dans mon point de vue, ce que je dois changer dansusers_controller.rb
si j'ai, par exemple,def show @user = User.find(params[:id]) ... end
?J'ai ajouté quelques informations à ce sujet pour le poste.
J'ai mis à jour la question avec une solution. Qu'en pensez-vous?
OriginalL'auteur Nikita Rybak
Juste au cas où vous n'êtes PAS rendu partiel, et ne souhaitez pas utiliser :option de modèle, cela peut aussi être fait dans les Rails 4 avec:
OriginalL'auteur Vlad
Url:
cela appel à l'utilisateur de la méthode sur pages_controller. Vous avez ceci:
Rails crée une variable d'instance @utilisateurs et, par défaut, essayez de le rendre un gabarit de vue dans app/views/pages/utilisateur.html.erb. Si ce n'est pas ce que vous voulez, vous avez à dire dans le contrôleur:
Ce sera désormais rendu app/views/users/montrer.html.erb avec une variable locale appelée l'utilisateur au lieu de la valeur par défaut app/views/pages/utilisateur.html.erb.
Actuellement, vous sont en attente jusqu'à ce que vous êtes à l'intérieur d'un gabarit de vue et puis leur demander de rendre un autre modèle de vue. Une fois que vous êtes dans un gabarit de vue, vous devriez seulement besoin de rendre partielle modèles:
J'espère que ça aide à clarifier.
Qu'avez-vous dans vos itinéraires.rb?
OriginalL'auteur mikewilliamson