Domanda

Ciao, voglio prefigurare questo dicendo che sono nuovo nella codifica.

Ho un problema che credo possa essere risolto in due modi

A. rendendo parziale

B. aggiornando il controller

(Posso assolutamente sbagliarmi, ma questi sono ciò che sospetto lol)

Ho due controller/visualizzazioni "recensioni" e "registri". E voglio che appaiano entrambi sulla stessa pagina.

Come posso fare questo? Ho provato a rendere parziale ma ho sempre ricevuto un errore.

E ho provato il pezzo di codice qui sotto:

che ha fatto apparire le mie recensioni sulla pagina, ma quando aggiungo

@log = @user.logs.all 

Ad esso, non tira tutti i registri nella pagina come fa per le recensioni.

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
È stato utile?

Soluzione

Cominciando dall'inizio. Visualizzazioni si riferiscono alle azioni nei controller. Quindi ci possono essere diverse viste per ciascun controller o anche nessuna.

Quindi, se vuoi rendere @reviews e @logs Nella stessa pagina è necessario prima istanziare entrambe le variabili di istanza nella stessa azione e quindi rendere entrambe le parziali nella stessa azione. Come si fa a farlo? Facile. Per prima cosa sei arrivato al controller che hai appena mostrato e modificarlo show azione.

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

Secondo: vai al tuo /app/views/reviews/show.html.erb Modello e metti entrambi i parziali lì in questo modo (questo è solo un esempio, regola il markup per soddisfare le tue esigenze).

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

Ora crea 2 nuovi parziali /app/views/reviews/_review.html.erb e /app/views/logs/_log.html.erb e metti lì tutto il markup necessario (usa variabili regolari review e log Per risolvere gli oggetti ripetuti). I binari ripeteranno automaticamente quei parziali quante sono necessarie.

Oppure puoi chiamare esplicitamente il rendering parziale

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

Altri suggerimenti

Ecco il modo di rendere parziali in viste in Haml:

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

Ogni parziale rendering in questo modo, deve essere creato nella stessa cartella. Il nome di ogni parziale deve iniziare con un sottolineaggio (_). Questa dovrebbe essere la directory della vista:

- home
    - index.html.haml
    - _header.html.haml
    - _footer.html.haml
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top