Как сделать вид в другой вид (рельсы 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 ответ:
Прежде всего. Представления относятся к действиям в контроллерах. Таким образом, для каждого контроллера может быть несколько представлений или даже ни одного.
Итак, если вы хотите отобразить
@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
и ставите оба партиалы там такие (это просто пример, подгоняйте разметку под свои нужды).Теперь создайте 2 новых партиала<h1> Reviews and Logs</h1> <div id="reviews_part"> <%= render @reviews %> </div> <div id="logs_part"> <%= render @logs %> </div>
/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>