Ruby on Rails:使用不显眼的 JavaScript 更新部分时出错

Ruby on Rails: error when using unobtrusive JavaScript to update partial

提问人:Mark Soden 提问时间:12/15/2013 最后编辑:helmbertMark Soden 更新时间:5/27/2015 访问量:247

问:

我正在使用 Rails 3.2.13,并且我正在尝试在创建“子”项后更新“摘要”部分。

我有一个模板和模板任务,我正在尝试做的是更新“显示”视图上的部分,这是一个摘要,指示分配给模板的任务数量。我在模板任务中执行此操作。create.js.erb

以下是以下内容:_template-summary.html.erb

<div id="template-summary-details">
<table class="table table-striped">
    <tbody>
    <tr>
        <td><span class="fa fa-th-list"></span> No. of tasks</td>
        <td><%= @template.templatetasks.count %></td>
    </tr>
    <tr>
        <td><span class="fa fa-clock-o"></span> Total task days</td>
        <td>                            
            <%= @template.templatetasks.sum(:days) %>
        </td>
    </tr>
    <tr>
        <td><span class="fa fa-check-square-o"></span> No. of checklists</td>
        <td>
            <%= @template.templatetasks.count(:checklist_id) %>
        </td>
    </tr>
    </tbody>
</table>                                
</div>

以下是以下内容:create.js.erb

<% @template = Template.where("id = ?", @templatetask.template_id?) %>

$("#template-summary-details").replaceWith("<%= escape_javascript(render partial:   "templates/template-summary", locals: {template: @template}) %>");

<% if @templatetask.parent_id? %>
$('#templatetasks'+<%= @templatetask.parent_id %>).prepend('<%= j render(@templatetask) %>');
<% else %>
$('#templatetasks').prepend('<%= j render(@templatetask) %>');
<% end %>

问题是我收到以下错误:

undefined method `where' for ActionView::Template:Class

我也尝试过使用,但也没有让它起作用。find

在创建模板任务期间,我将如何将其传递给部分?@template

javascript ruby-on-rails ruby-on-rails-3 unobtrusive-javascript

评论


答:

2赞 Steve 12/15/2013 #1

第一个问题是 Rails 类 ActionView::Template 和模型类之间存在名称冲突。您可以通过将模型类称为(顶级 Ruby 类)来解决此问题。例如Template::Template

<% @template = ::Template.where("id = ?", @templatetask.template_id).first %>

但这只是进行主键查找的一种迂回方式,它更简单:find

<% @template = ::Template.find(@templatetask.template_id) %>

更简单的是,如果您已经设置了 from 的关联,则可以直接引用相关对象:belongs_toTemplateTaskTemplate

<% @template = @templatetask.template %>

这可能会让你走得更远,但如果你想使你的部分更可重用,最好避免让它们引用实例变量(例如)。相反,部分应该引用您通过哈希传递到方法中的局部变量(您已经在这样做了)。@templatetemplaterenderlocals

评论

0赞 Mark Soden 12/18/2013
感谢您的回复。.设法让它工作;)