Проблема частичного рендеринга в макете приложения (Rails) - PullRequest
6 голосов
/ 02 декабря 2009

Вот вызов в файле application.html.erb:

<%= render :partial => 'tasks/_new' %>

Вот часть визуализации (_new.html.erb):

<% form_for @task do |f| -%>
  <%= f.text_field :body %>
  <%= submit_tag "Submit" %>
<% end -%>

Вот метод в контроллере 'tasks':

def new
  @task = Task.new

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @task }
  end
end

Вот сообщение об ошибке, которое я получаю:

Missing template tasks/__new.erb in view path app/views

И это говорит об ошибке в этой строке:

<%= link_to "tasks", tasks_path %> <%= render :partial => 'tasks/_new' %>

Файл находится в правильном каталоге. Странная вещь в том, что есть дополнительные _ в имени файла, в ошибке. Когда я сдаюсь и переименую частично к __new.erb, вот ошибка, которую я получаю:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

И это говорит об ошибке в этой строке:

<% form_for @task do |f| -%>

Я также пытался без _ в коде, как предложил Петрос, но он возвращает ту же ошибку, что и выше, Called id for nil….

Что происходит?

Ответы [ 3 ]

9 голосов
/ 02 декабря 2009

Вам не нужно _ в вашем коде.Это должно быть:

<%= render :partial => 'tasks/new' %>

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

Вторая ошибка - ваша настоящая проблема.Ошибка предполагает, что @task равен нулю.Это верно, потому что частичное знает только то, что знает контейнерное представление, и ваше представление в тот конкретный момент не вызвало действие от соответствующего контроллера.Как вы (Малыш Диего) уже обнаружили и указали в одном из ваших комментариев ниже, вам нужно было создать экземпляр Задачи в своей части.Я не знаю, есть ли более элегантное решение, но, возможно, кто-то может предложить что-то лучшее в будущем.

Спасибо MattMcKnight за сообщение, что само частичное знает только то, что знает представление контейнера.1008 *

4 голосов
/ 02 декабря 2009

Петрос правильно определил первую проблему - вам не нужно подчеркивание при частичном вызове. Второе, что нужно знать о частичностях, это то, что они не вызывают метод контроллера, они просто ссылаются на представление. Таким образом, вам нужно настроить объект @task в каждом действии, которое использует этот частичный элемент, или просто вызвать Task.new в частичном. Когда у меня есть партиал в макете в похожих ситуациях, я обычно загружаю его с помощью JavaScript, чтобы я мог вызвать действие.

1 голос
/ 10 марта 2012

Если частичному необходимо знать о переменной в вызывающем файле erb, вы можете передать ее следующим образом:

<%= render partial: "tasks/new", locals: { task: @task } %>

И в файле app/views/tasks/_new.html.erb, обратитесь к переменной следующим образом:

<% form_for task do |f| %>
  <%= f.text_field :body %>
  <%= submit_tag "Submit" %>
<% end %>

То есть без @. (Код a: b - это просто более удобная форма :a => b.)

Интересно, почему вы хотите использовать партиалы в файле application.html.erb? Я предполагаю, что вы имеете в виду сгенерированный Ruby файл app/views/layouts/application.html.erb, который предполагается использовать как файл макета, содержащий элементы, общие для всех страниц вашего приложения, а не для бизнес-логики. Возможно, файл, из которого вам нужно вызвать партиал, это app/views/tasks/index.html.erb?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...