0

我正在使用这个 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 所推荐的:如何在 rake 任务中渲染 ERb 模板?在类似的情况下。我在视图和控制器中尝试了以下包含,结果相同:

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 来尝试将更改处理程序附加到视图中的字段?

4

2 回答 2

2

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

更新:

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

<% environment.context_class.instance_eval { include ActionView::Helpers::UrlHelper } %>
<% environment.context_class.instance_eval { include ActionView::Helpers::TagHelper } %>
于 2012-04-28T17:59:22.713 回答
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 #<#<Class:0x9078290>:0xa1bee8c>。请将以上两行替换为:

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers} %>
于 2013-05-11T07:20:01.953 回答