在应用程序布局中呈现部分问题(Rails)

时间:2009-12-02 02:40:21

标签: ruby-on-rails forms

以下是application.html.erb文件中的电话:

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

我也尝试过没有代码中的_,正如Petros建议的那样,但它会返回与上面相同的错误Called id for nil…

发生了什么事?

3 个答案:

答案 0 :(得分:9)

您的代码中不需要_。它应该是:

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

第一个错误是因为您不需要将_放在:partial参数中。 Rails负责这一点。这就是为什么你得到双__因为Rails会为你准备一个。

第二个错误是你真正的问题。该错误表明@task为零。这是正确的,因为partial只知道容器视图知道什么,并且您在该特定时刻的视图没有从适当的控制器调用该操作。正如您(Baby Diego)已经发现并在下面的一条评论中指出的那样,您需要在部分中创建一个任务实例。我不知道是否有更优雅的解决方案,但也许有人可以在将来提出更好的建议。

感谢MattMcKnight通知我们部分本身只知道容器视图知道什么。

答案 1 :(得分:4)

Petros正确地确定了第一个问题 - 在部分调用中你不需要下划线。 关于partials的第二件事是他们不调用控制器方法,他们只是引用视图。因此,您需要在使用该部分的每个操作中设置@task对象,或者只在部分中调用Task.new。当我在类似情况下在布局中有部分时,我通常使用JavaScript加载它,以便我可以调用该操作。

答案 2 :(得分:1)

如果部分需要知道调用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