Вопрос

Привет, я хочу предвосхитить это, сказав, что я новичок в кодировании.

У меня есть проблема, которая, как я считаю, может быть решена двумя способами

A., сделав частичный

B. Обновляя контроллер

(Я могу ошибаться, но это то, что я подозреваю, лол)

У меня есть два контроллера/представления «обзоры» и «журналы». И я хочу, чтобы они оба появлялись на одной странице.

Как я могу это сделать? Я попытался сделать частичный, но я всегда получу ошибку.

И я попробовал кусок кода ниже:

что заставило мои обзоры отображаться на странице, но когда я добавляю

@log = @user.logs.all 

Для этого он не тянет все журналы на страницу, как это происходит для обзоров.

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
Это было полезно?

Решение

Перво -на первый взгляд. Просмотры относятся к действиям в контроллерах. Таким образом, может быть несколько просмотров для каждого контроллера или даже ни одного.

Итак, если вы хотите отображать @reviews а также @logs На одной и той же странице вы должны сначала создать оба переменных экземпляра в одном и том же действии, а затем отображать оба частичных в одном и том же действии. Как ты это делаешь? Легкий. Сначала вы добрались до контроллера, который вы только что показали, и отредактируете это show действие.

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

Второе: вы идете к своему /app/views/reviews/show.html.erb Шаблон и поместите туда оба частичного такого (это всего лишь пример, отрегулируйте свою разметку, чтобы соответствовать вашим потребностям).

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

Теперь создайте 2 новые частичные /app/views/reviews/_review.html.erb а также /app/views/logs/_log.html.erb и поместите туда всю необходимую наценку (используйте обычные переменные review а также log Чтобы распространить повторяющиеся объекты). Rails автоматически повторяет эти частичные столько раз, сколько необходимо.

Или вы можете явно вызвать частичное рендерин

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

Другие советы

Вот способ превращения частичных в взгляды в Haml:

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

Каждый частичный, который вы выполняете таким образом, должен быть создан в одной и той же папке. Имя каждого частичного должно начаться с подчеркивания (_) Это должен быть каталог представления:

- home
    - index.html.haml
    - _header.html.haml
    - _footer.html.haml
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top