代码之家  ›  专栏  ›  技术社区  ›  San Diago

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

  •  6
  • San Diago  · 技术社区  · 15 年前

    这是电话号码 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 回复  |  直到 15 年前
        1
  •  9
  •   Petros    15 年前

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

    第一个错误是因为不需要将uu放在:partial参数中。Rails负责这件事。这就是为什么你会得到双倍,因为Rails会给你一个。

    感谢MattMcKnight通知我们,分部本身只知道容器视图知道的内容。

        2
  •  4
  •   MattMcKnight    15 年前

    关于partials要知道的第二件事是,它们不调用controller方法,它们只引用视图。因此,您需要在使用该部分的每个操作中设置@task对象,或者只在部分中调用task.new。在类似情况下,当布局中有一个分部时,我通常使用JavaScript加载它,以便调用该动作。

        3
  •  1
  •   Teemu Leisti    12 年前

    如果partial需要了解调用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