Как сделать вид в другой вид (рельсы 4)


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

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

A. путем рендеринга частичного

B. путем обновления контроллера

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

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

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

И Я попробовал следующий фрагмент кода:

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

@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
1 4

1 ответ:

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

Итак, если вы хотите отобразить @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 для адресации повторяющихся объектов). Рельсы автоматически повторят эти партиалы столько раз, сколько потребуется.

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

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