Rails form_for:remote => true不是调用js方法

时间:2010-11-19 17:38:48

标签: ruby-on-rails ruby-on-rails-3

我不知道为什么这不起作用,我正在学习轨道,我正在读一本书,据说这样做:

    <%= form_for([@article,@article.comments.new ], :remote=>true, :html => {:style=>'display: none;' }) do |f|%>
    <div class="field">
      <%=    f.label :name %>
      <%=    f.text_field :name %>
    </div>
    <div class="field">
      <%=    f.label :email %>
      <%=    f.text_field :email %>
    </div>
    <div class="field">
      <%=    f.label :body %>
      <%=    f.text_area :body %>
    </div>
    <%= f.submit %>
<% end %>

然而它不起作用,当我在firebug中检查请求时,url不会以.js结尾,你有什么想法吗?

8 个答案:

答案 0 :(得分:34)

当你检查在firebug中发出的请求时,只是因为url没有以.js结尾,这并不意味着它不是从javascript调用的。验证是否应检查请求标头以查看Accept参数是什么。如果它说“application / javascript”那么一切都很好。

其次,开始尝试时遇到一个非常常见的问题:remote =&gt;的确,您的代码中不包含所需的JavaScript库。所以我的猜测是你的布局中缺少以下代码:

<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

如果是这种情况,请将其包含在布局的<head>标记内。

答案 1 :(得分:21)

最有可能发生的情况是,您缺少rails.js文件,无论您使用的是原型还是jquery,它都会为您处理。

如果您使用的是jQuery,获取所有需要文件的最简单方法是使用jquery-rails gem。这将添加一个生成器来安装jquery和所需的rails.js。

在rails应用程序根目录中键入类似内容:

rails g jquery:install

然后,在application.html.erb内添加行

<%= javascript_include_tag :defaults %>

或明确(不要忘记单独包含您的jquery):

<%= javascript_include_tag :rails, :application %>

[编辑:使用资产管道的Rails 3.1或更高版本]

使用jquery-rails gem(如上所述)并将以下行添加到app/assets/javascripts/application.js(如果它们不存在):

//= require jquery
//= require jquery_ujs

希望这有帮助!

答案 2 :(得分:7)

如果您尚未添加 jquery_ujs 文件,则会发生此错误。你刚才包含了jquery文件。

因此,您需要在视图中手动添加这两个文件,或者在 application.js 或您用于特定布局的任何其他文件中要求它们。

根据您的情况,您可以遵循第一或第二个解决方案。

第一个解决方案:

<%= javascript_include_tag :jquery, :jquery_ujs %>

第二个解决方案:

  1. app / assets / application.js

    需要 jquery jquery_ujs
    //= require jquery.js
    
    //= require jquery_ujs
    
  2. 在您的特定布局文件中包含application.js文件。

    <%= javascript_include_tag :application %>
    
  3. 注意:

    同时在两个解决方案的布局文件中添加csrf标记。

    <%= csrf_meta_tag %>
    

    我认为您的Gemfile中有以下代码,并且已安装此Gem。

    gem 'jquery-rails'
    

答案 3 :(得分:6)

检查您的/app/assets/javascript/application.js文件

它应该包含在那里的文件下面。 jquery_ujs负责处理remote=> true功能。

require `jquery`
require `jquery_ujs`

快乐编码!!

答案 4 :(得分:4)

检查控制器:它是否有响应块?

如果您使用rails generate scaffold生成应用程序,它将具有类似

的内容
    respond_to do |format|
      format.html
      format.xml  { .... }
    end

如果确实有,只需从整个区块中取出,从respond_to到结束;或者用单行替换整个块

    respond_to :html, :js

或者通过添加此处显示的额外行来编辑块

    respond_to do |format|
      format.html
      format.js
      format.xml  { .... }
    end

要么适用于你的情况。

答案 5 :(得分:0)

如果您有一个file_field,那么它会以html格式提交,即使remote: true-我花了很长时间来解决这个问题,所以我添加了这个答案也许可以节省其他人的时间,有解决方案,请使用远程宝石,请参见答案here

答案 6 :(得分:0)

如果以上答案均不能为您解决,请仔细检查您是否未呈现remote: true(或local: false)表单嵌套在页面中的另一表单中 。这给我们造成了问题。

答案 7 :(得分:-11)

更改:

[@article,@article.comments.new ] 

代表

@article

我建议您阅读相关部分的API:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html