ActionView :: Template :: Error(未定义的局部变量或方法......或者没有错误

时间:2016-11-03 22:13:01

标签: ruby-on-rails ajax

我想在' index'上使用ajax创建动作页。我在SO上发现了一些类似的问题,尝试使用它,但到目前为止我没有帮助。 HTML工作正常,只有JS才是问题。

walls_controller:

def items
  @item = Item.new
  @items = current_user.items
  find_items
  @ads = @items_ads
end

def create
  @items = current_user.items
  find_items
  #@items_ads via find_items method
  @ads = @items_ads  
  @item = current_user.items.build item_params
  current_user.save
  respond_to do |format|
    format.html { redirect_to :back }
    format.js
  end
end

items.html.erb:

<div id="items1">
  <div class="row">
    <div class="col-md-3">
      <h3>Wall of user <%= current_user.name %></h3>
      <div>
        <%= render 'item_form', item: @item %>
      </div>
      Currently you are looking for these items:
      <div>
        <%= render 'items_list', items: @items %>
      </div>
    </div>
    <div>
      <%= render 'ads/ads_list', ads: @ads %>
    </div>
  </div>
</div>

_item_form.html.erb:

<%= form_for(item, url: wall_items_path, remote: true) do |f| %>
...

首先我有错误:

ActionView::Template::Error (undefined local variable or method `items' for #<#<Class:...

然后我从

更改了create.js.erb
$("#items1").html("<%= render 'items_list', locals: {items: @items} %>");
$("#items1").html("<%= render 'ads_list', locals: {ads: @ads} %> ");

$("#items1").html("<%= render 'items_list', items: @items %>");
$("#items1").html("<%= render 'ads/ads_list', ads: @ads %>");

现在它没有向我显示任何错误,但在浏览器上尝试JS时没有明显的变化。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

渲染部分

您可以通过两种方式使用本地数据呈现部分:

选项1

快捷方式

<%= render "my_partial", local_var_1: some_var, local_var_2: another_var %>

快捷方式版本将部分名称作为第一个参数,将局部变量的哈希作为第二个参数。

选项2

长格式版

此表单只带有Hash形式的单个参数以及所有选项。

不要混合和匹配表格

执行以下操作会产生意外结果

<%= render "my_partial", locals: { local_var_1: some_var, local_var_2: another_var } %>

从技术上讲,您使用的是快捷版本(选项1),渲染部分名为&#34; my_partial&#34;使用一个名为locals的局部变量。

您可以在部分内部使用local_var_1local_var_2,但实际上只能获得一个名为locals的局部变量。

在SJR模板中渲染部分

escape_javascript GOTCHA

在服务器生成的JavaScript模板(SJR)中,每当渲染包含HTML的内容时,必须记住使用escape_javascript

$("#my-selector").html("<%= escape_javascript render('my_partial') %>");

无论您选择如何呈现部分(即上面的选项1或选项2),您都必须记住将其包装在escape_javascript(或其别名j)调用中。

有用的资源