【问题标题】:How to use Rails 3 url_for method for the url parameter of $.ajax in jQuery?如何在 jQuery 中对 $.ajax 的 url 参数使用 Rails 3 url_for 方法?
【发布时间】:2012-04-28 15:53:12
【问题描述】:

我正在使用这个 javascript 来代替 remote_action:

$(document).ready(function() {
    $('#asset_category_id').change(function() {
        $.ajax({
            url : '<%= escape_javascript(url_for :controller => :categories, :action => :update_subcategories) %>',
    data : 'category_id=' + this.value,
    success : function(data) {
        $('#subcategories_div').html(data);
        $('#subcategories_div').show();
            }
        })
    });
});

以下行中的 url 格式不正确:

url : '<%= escape_javascript(url_for :controller => :categories, :action => :update_subcategories) %>'

按字面意思使用:

http://localhost:3000/assets/%3C%=%20escape_javascript(url_for%20:controller%20=%3E%20:categories,%20:action%20=%3E%20:updates_subcategories)%20%%3E?category_id=156

如何在 jQuery 中使用 url_for?有可能吗?

如果我使用

url : '/categories/update_subcategories'

一切都按预期运行。

编辑: 我没有运气尝试过以下事情。

似乎我应该使用 @Matzi 和 @Baldrick 所指出的预处理 (guides.rubyonrails.org/asset_pipeline.html#preprocessing),所以我的文件应该是 main.js.erb。我在 app/assets/javascripts 中重命名了这个文件。当我转到资产/新视图(需要文件的位置)时,出现此错误:

undefined method 'url_for' for #<#<Class:0x9853e4c>:0xab00c48>

我尝试将这两行添加到 assets_controller:

include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper

然后我得到:

undefined local variable or method `controller' for #<AssetsController:0xa40aaec>

在这行视图中:

<%= form_for(@asset) do |f| %>

我也尝试将这些行添加到 new.html.erb 文件中:

<%= include ActionView::Helpers::UrlHelper %>
<%= include ActionView::Helpers::TagHelper %>

然后我得到:

undefined method `include' for #<#<Class:0xab164d0>:0xab0183c>

根据Rails 3: How to render ERb template in rake task? 在类似情况下的建议。我在视图和控制器中尝试了以下包含,结果相同:

include Rails.application.routes.url_helpers # brings ActionDispatch::Routing::UrlFor
include ActionView::Helpers::TagHelper

@Matzi 推荐的我尝试过的另一件事是将 main.js.erb 从 app/assets/javascripts/ 移动到 app/views/assets。但在这种情况下,main.js.erb 中的 Javascript 似乎不会与视图 new.html.erb 同时加载。我尝试将 main.js.erb 重命名为 new.js.erb,但文件中的 JS 似乎也没有加载。

虽然我使用 JS 来附加处理程序并使用 js.erb 来返回结果,但我需要第一个 JS 中的 url_for 才能知道在哪里调用。

所以问题仍然存在,如何在 js.erb 中使用 url_for 来尝试将更改处理程序附加到视图中的字段?

【问题讨论】:

  • 哪个文件包含$(document).ready(function() { ...代码?
  • @Baldrick javascript $(document).ready(function() { ... 在 app/assets/javascripts/main.js 中肯定会加载它,因为如果我使用文字 url,它会按预期运行。
  • 正如Matzi所说,应该在.js.erb文件中处理js文件中的ruby代码。在此处阅读有关预处理的更多信息:guides.rubyonrails.org/asset_pipeline.html#preprocessing

标签: ruby-on-rails-3 jquery


【解决方案1】:

我认为问题在于它位于 .js 文件中,而 ruby​​ 无法解释该文件。尝试将此代码放在 .js.erb 文件中,它会为您工作。

更新:

资产不适用于这种动态行为,因此您最好将其移动到某个视图中,并在需要时进行渲染。如果要在资产中使用它,则需要在 .js.erb 中包含帮助程序:

<% environment.context_class.instance_eval { include ActionView::Helpers::UrlHelper } %>
<% environment.context_class.instance_eval { include ActionView::Helpers::TagHelper } %>

【讨论】:

  • 哇。预处理非常强大。现在似乎正在解释 js.erb 文件 &lt;%= url_for(:controller =&gt; :categories, :action =&gt; :update_subcategories) %&gt; 中的 ruby​​ 片段,但我收到一个新错误:undefined method 'url_for' for #&lt;#&lt;Class:0x9853e4c&gt;:0xab00c48&gt;。我试图将include ActionView::Helpers::UrlHelper 行添加到视图控制器,但我得到另一个错误:undefined local variable or method 'controller' for #&lt;AssetsController:0x994d12c&gt;。有任何想法吗?为什么js.erb文件中没有url_for?
  • 此文件是否在您的 view-s 目录之一中?理论上,rails 将这些文件链接到控制器,允许它们访问辅助方法。所以试着移动你的文件,或者只是在文件开头包含这些:&lt;% include ActionView::Helpers::UrlHelper %&gt; 和``。
  • 我已经调查了你所说的没有运气。我已经用我尝试过的新事物更新了我的问题。
  • 好的,你肯定应该在视图中移动你的代码,然后渲染它。资产不是为了这个。但是,请参阅更新。我希望这是决赛。 :)
  • 将这两行添加到 js.erb 会返回另一个错误:undefined local variable or method '_routes' for #&lt;#&lt;Class:0x9078290&gt;:0xa1bee8c&gt; 但我接受您的回复 Asset is not for this kind of dynamic behavior 我认为我肯定做错了什么,我将重新设计交互。谢谢!
【解决方案2】:

当你在 js.erb 中添加两行时:

<% environment.context_class.instance_eval { include ActionView::Helpers::UrlHelper } %>
<% environment.context_class.instance_eval { include ActionView::Helpers::TagHelper } %>

并获得另一个error: undefined local variable or method '_routes' for #&lt;#&lt;Class:0x9078290&gt;:0xa1bee8c&gt;。请将以上两行替换为:

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers} %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2012-09-16
    • 1970-01-01
    • 2023-04-01
    • 2012-07-15
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多