Pergunta

Olá, quero começar dizendo que sou novo em codificação.

Tenho um problema que acredito que pode ser resolvido de duas maneiras

A.renderizando uma parcial

B.atualizando o controlador

(Posso estar totalmente errado, mas é disso que suspeito haha)

Eu tenho dois controladores/visualizações "revisões" e "logs".e quero que ambos apareçam na mesma página.

Como posso fazer isso?Tentei renderizar uma parcial, mas sempre recebo um erro.

e tentei o trecho de código abaixo:

o que fez com que meus comentários aparecessem na página, mas quando adiciono

@log = @user.logs.all 

para isso, ele não puxa todos os logs para a página como faz para as revisões.

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
Foi útil?

Solução

Primeiras coisas primeiro.As visualizações referem-se a ações nos controladores.Portanto, pode haver várias visualizações para cada controlador ou até mesmo nenhuma.

Então, se você quiser renderizar @reviews e @logs na mesma página você deve primeiro instanciar ambas as variáveis ​​de instância na mesma ação e depois renderizar ambas as parciais na mesma ação.Como você faz isso?Fácil.Primeiro você chegou ao controlador que acabou de mostrar e editou-o show Ação.

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

Segundo:você vai para o seu /app/views/reviews/show.html.erb modelo e coloque os dois parciais assim (este é apenas um exemplo, ajuste sua marcação para atender às suas necessidades).

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

Agora crie 2 novas parciais /app/views/reviews/_review.html.erb e /app/views/logs/_log.html.erb e coloque toda a marcação necessária lá (use variáveis ​​regulares review e log para abordar os objetos repetidos).O Rails repetirá automaticamente essas parciais quantas vezes forem necessárias.

Ou você pode chamar explicitamente a renderização parcial

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

Outras dicas

Aqui está a maneira de renderizar parciais em vistas em Haml:

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

Cada parcial que você renderiza dessa maneira deve ser criado dentro da mesma pasta. O nome de cada parcial deve começar com um sublinhado (_). Este deve ser o diretório da visão:

- home
    - index.html.haml
    - _header.html.haml
    - _footer.html.haml
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top