2009-12-02 2 views
6

Вот вызов в файле application.html.erb:Проблемы рендеринг частичными в макете приложения (Rails)

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

Вот частичный визуализируемый (_new.html.erb):

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

Вот метод в " диспетчер задач:

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….

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

ответ

9

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

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

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

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

Благодаря MattMcKnight для информирования нас о том, что частичный сам знает только то, что знает контейнер.

+0

Извините, я должен был указать. Я тоже это пробовал. Он вернул ошибку «id id для nil». Я собираюсь исправить ОП. –

+0

Можете ли вы попробовать <% = render: partial => 'tasks/new', locals => {: task => @task}%> ... Возможно, вам придется изменить @task на задачу в частичном или добавить код в верхняя часть частичного выполнения <% @task = task, если @task == nil%> – Petros

+0

Я пытался сделать эту работу, но не смог. Вы помогли мне понять, что проблема заключалась в том, что не было экземпляра «@task», фактически достигающего макета приложения, поскольку он связан с контроллером задач, поэтому я попробовал «<% form_for Task.new do | f | -%>» и это сработало. Но это похоже на хак. Правильно ли это? –

4

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

+0

Я вызываю его из макета приложения, действие с использованием частичного будет что-то в контроллере приложения, не так ли? Кроме этого, я использую «<% form_for Task.new do | f | -%>» вместо этого, это не взлом? –

+0

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

+0

Не взломать вызов метода класса на модели. Вызов <% tasks = Task.find (: all,: conditions => "complete = false")%> в частичном будет близок к взлому. Я думаю, что ключевая концепция, которую некоторые люди не понимают в Rails, заключается в том, что вызываются только одно действие (так называемый метод контроллера). – MattMcKnight

1

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

<%= 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?

Смежные вопросы