Question

Salut, je veux préfacer cela en disant que je suis nouveau dans le codage.

J'ai un problème qui, je crois, peut être résolu de deux manières

A. en rendant un partiel

B. en mettant à jour le contrôleur

(Je peux totalement me tromper mais c'est ce que je soupçonne lol)

J'ai deux contrôleurs / vues "avis" et "journaux". Et je veux qu'ils apparaissent tous les deux sur la même longueur d'onde.

Comment puis-je faire ceci? J'ai essayé de rendre un partiel mais j'obtiens toujours une erreur.

Et j'ai essayé le morceau de code ci-dessous:

Ce qui a fait apparaître mes critiques sur la page, mais quand j'ajoute

@log = @user.logs.all 

Pour cela, il n'attire pas tous les journaux à la page comme pour les avis.

def show
  @user = User.find_by_name(params[:id])
  if @user 
    @reviews = @user.reviews.all
    render action: :show
  else
    render file: 'public/404', status: 404, formats: [html]
  end
end
Était-ce utile?

La solution

Tout d'abord. Les vues se réfèrent aux actions dans les contrôleurs. Il peut donc y avoir plusieurs vues pour chaque contrôleur ou même aucune.

Donc, si vous voulez rendre @reviews et @logs Sur la même page, vous devez d'abord instancier les deux variables d'instance dans la même action, puis rendre les deux partiels dans la même action. Comment tu fais ça? Facile. Vous êtes d'abord arrivé au contrôleur que vous venez de montrer et de le modifier show action.

def show       
  # You can set the variable in the if-clause 
  # And you also need to use static finders with a hash as an argument in Rails4
  if (@user = User.find_by(name: params[:id]))
     @reviews = @user.reviews.all 
     @logs = @user.logs.all
  # You don't need to call render explicitly 
  # if you render the view with the same name as the action 
   else
     render file: 'public/404', status: 404, formats: [html]
   end     
end

Deuxièmement: vous allez à votre /app/views/reviews/show.html.erb modèle et y mettre les deux partiels comme celui-ci (ce n'est qu'un exemple, ajustez votre balisage pour répondre à vos besoins).

<h1> Reviews and Logs</h1>
<div id="reviews_part">
 <%= render @reviews %>
</div>
<div id="logs_part">
  <%= render @logs %>
</div>

Créez maintenant 2 nouveaux partiels /app/views/reviews/_review.html.erb et /app/views/logs/_log.html.erb et mettez tout le balisage nécessaire là-bas (utilisez des variables régulières review et log pour additionner les objets répétitifs). Les rails répéteront automatiquement ces partiels autant de fois que nécessaire.

Ou vous pouvez explicitement appeler le rendu partiel

<div id="reviews_part">
  <% @reviews.each do |review| %>
   <%= render review %> 
        which is the same as
   <%= render partial:"reviews/review", locals:{review:review} %>
  <% end %>
</div>

Autres conseils

Voici la façon de rendre partiels dans les vues de Haml:

=render :partial => "header"
%h2 Hello World
=render :partial => "footer"

Chaque partiel que vous rendez de cette façon doit être créé dans le même dossier. Le nom de chaque partiel doit commencer par un soulignement (_). Cela devrait être le répertoire de la vue:

- home
    - index.html.haml
    - _header.html.haml
    - _footer.html.haml
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top