Проблема при рендеринге шаблона, передающего локальную переменную - PullRequest
9 голосов
/ 16 февраля 2011

Я использую Ruby on Rails 3, и я хотел бы отобразить шаблон (show.html.erb), передающий локальную переменную.

В RAILS_ROOT/views/users/show.html.erb У меня

Name: <%= @user.name %>
Surname: <%= @user.surname %>

Iтакже есть контроллер страниц для обработки страниц и в application_controller.rb istance @current_user.Страница называется user, поэтому в RAILS_ROOT/views/pages/user.html.erb у меня есть

<%= render :template => "users/show", :locals => { :user => @current_user } %>

Приведенный выше код не работает (я получаю эту ошибку: RuntimeError in Pages#user, Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id), но это работает:

<%= render :template => "users/show", :locals => { :user => @user = @current_user } %>

Я думаю, что не очень хороший способ "перезаписать" переменную @user.Это потому, что, например, если мне нужно вспомнить @user после вышеприведенного выражения 'render', оно больше не будет работать.

Итак, что такое решение для рендеринга show.html.erb?


Я пробовал также

<%= render :template => "users/show", :locals => { @user => @current_user } %>
<%= render :template => "users/show", :locals => { :object => @current_user, :as => @user }

, но они не работают.


ОБНОВЛЕНИЕ

Если в pages_controller.rb я поставлю это

def user
  @user ||= @current_user
end

, оно будет работать и в файлах просмотра вы можете просто использовать

<%= render :template => "users/show" %>

В любом случае, я обнаружил, что яиметь эту ошибку (см. ниже для получения дополнительной информации):

ActionController::RoutingError in Pages#user
No route matches {:action=>"destroy", :controller=>"users"}

Ошибка генерируется из этого оператора form , расположенного в частично загруженном из show.html.erb:

<%= form_for(@user, :url => user_path) do |f| %>
  ...
<% end %>

Ответы [ 3 ]

18 голосов
/ 16 февраля 2011
:locals => { :user => @current_user }

и в шаблоне

Name: <%= user.name %>

Локальные переменные являются локальными, поэтому вам не нужно @ для их ссылки.

@ user502052
Вы можете явно отобразить представление из вашего контроллера.

render :template => "users/show", :locals => {...}

Когда вы не выполняете render в контроллере, framework делает это для вас с параметрами по умолчанию.Когда вы это сделаете, вы можете указать другой файл шаблона, передать локальные переменные, отобразить частичное: что угодно render функция поддерживает.

2 голосов
/ 15 января 2015

На тот случай, если вы НЕ рендерите частичную часть и не хотите использовать параметр шаблона: это также можно сделать в Rails 4 с помощью:

render 'users/show', {user: @current_user}
0 голосов
/ 16 февраля 2011

Url:

http://localhost/pages/user

это вызовет метод пользователя для pages_controller.У вас есть это:

def user
  @user ||= @current_user
end

Rails создает переменную экземпляра @users и по умолчанию попытается отобразить шаблон представления в app / views / pages / user.html.erb.Если это не то, что вы хотите, вы должны сказать так в контроллере:

def user
  @user ||= @current_user
  render :template => "users/show", :locals => { :user => @current_user }
end

Теперь это будет отображать app / views / users / show.html.erb с локальной переменной с именем user вместоприложение по умолчанию / views / pages / user.html.erb.

В настоящее время вы ожидаете, пока не окажетесь внутри шаблона представления, а затем просите отрендерить другой шаблон представления.После того, как вы попали в шаблон представления, вам нужно будет только визуализировать частичные шаблоны:

render :partial => 'users/show', :locals => {:user => @current_user}

Надеюсь, это поможет уточнить.

...