Ruby on rails Rails正在尝试远程渲染。。。但不是
我正在开发一个rails应用程序,并试图将gem下个月的链接转换为ajax响应 我将链接设置为远程:Ruby on rails Rails正在尝试远程渲染。。。但不是,ruby-on-rails,ruby-on-rails-3,calendar,Ruby On Rails,Ruby On Rails 3,Calendar,我正在开发一个rails应用程序,并试图将gem下个月的链接转换为ajax响应 我将链接设置为远程: def month_link(month_date) link_to I18n.localize(month_date, :format => "%B"), {:month => month_date.month, :year => month_date.year}, remote: true end 告诉它回复js
def month_link(month_date)
link_to I18n.localize(month_date, :format => "%B"),
{:month => month_date.month, :year => month_date.year},
remote: true
end
告诉它回复js
respond_to do |format|
format.html
format.js { render text: "help me!" }
end
而且它有效
Started GET "/calendar/2012/6" for 127.0.0.1 at 2012-07-03 15:27:42 -0500
Processing by CalendarController#index as JS
Parameters: {"year"=>"2012", "month"=>"6"}
Event Load (0.3ms) SELECT "events".* FROM "events" WHERE (('2012-05-27 05:00:00.000000' <= end_at) AND (start_at< '2012-07-01 05:00:00.000000')) ORDER BY start_at ASC
Rendered text template (0.0ms)
Completed 200 OK in 14ms (Views: 0.7ms | ActiveRecord: 0.3ms)
嗯。。。除了它实际上没有渲染任何东西的部分,我通过了它。如果我只是告诉它在不渲染的情况下格式化.js,它实际上不会响应js文件
什么会导致渲染不显示
更新
我刚刚注意到,如果你像这样访问localhost:3000/calendar/2012/6.js的url,它会按预期工作,所以我认为这是一个如何设置链接的问题
好的,我让js文件工作了,但是我不知道为什么。我想我错过了使用render,尽管我可以发誓我曾经使用过它进行调试。我猜render实际上只在响应html请求时呈现html页面。这是有意义的,因为它将json传递给javascript以用于ajax请求
问题的另一部分是我试图将CoffeeScript与index.js.coffee.erb或index.js.erb.coffee一起使用。我认为它工作时间最长,但真正发生的是,它使用了我首先编写的原始index.js.erb,尽管我已经删除了它。一旦我重新启动服务器,一切都坏了
试试这个:
def month_link(month_date)
link_to I18n.localize(month_date, :format => "%B"),
{:remote=>true, :month => month_date.month, :year => month_date.year}
end
您希望使用的链接格式为:
link_to(body, url_options = {}, html_options = {})
:remote=>true希望位于url\u选项中。我不确定:month&:year键是用于什么的,但如果它们是html选项,您可能会想要:
def month_link(month_date)
link_to I18n.localize(month_date, :format => "%B"),
{:remote=>true},
{:month => month_date.month, :year => month_date.year}
end
默认情况下,“远程”选项似乎会忽略渲染或重定向的任何尝试。考虑到Ajax的目的是防止这两种情况。。。我明白为什么了 据我所知,在创建远程链接时,会发生以下情况,仅供参考: jquery_ujs.js的第51行
$.rails = rails = {
// Link elements bound by jquery-ujs
linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]',
在链接ClickSelector之后,我们在第300行找到了这个函数
$(document).delegate(rails.linkClickSelector, 'click.rails', function(e) {
var link = $(this), method = link.data('method'), data = link.data('params');
if (!rails.allowAction(link)) return rails.stopEverything(e);
if (link.is(rails.linkDisableSelector)) rails.disableElement(link);
if (link.data('remote') !== undefined) {
if ( (e.metaKey || e.ctrlKey) && (!method || method === 'GET') && !data ) { return true; }
if (rails.handleRemote(link) === false) { rails.enableElement(link); }
return false;
} else if (link.data('method')) {
rails.handleMethod(link);
return false;
}
});
假设handleRemote处理AJAX,我们在第107行找到这个怪物
// Submits "remote" forms and links with ajax
handleRemote: function(element) {
var method, url, data, crossDomain, dataType, options;
if (rails.fire(element, 'ajax:before')) {
crossDomain = element.data('cross-domain') || null;
dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
if (element.is('form')) {
method = element.attr('method');
url = element.attr('action');
data = element.serializeArray();
// memoized value from clicked submit button
var button = element.data('ujs:submit-button');
if (button) {
data.push(button);
element.data('ujs:submit-button', null);
}
} else if (element.is(rails.inputChangeSelector)) {
method = element.data('method');
url = element.data('url');
data = element.serialize();
if (element.data('params')) data = data + "&" + element.data('params');
} else {
method = element.data('method');
url = rails.href(element);
data = element.data('params') || null;
}
options = {
type: method || 'GET', data: data, dataType: dataType, crossDomain: crossDomain,
// stopping the "ajax:beforeSend" event will cancel the ajax request
beforeSend: function(xhr, settings) {
if (settings.dataType === undefined) {
xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
}
return rails.fire(element, 'ajax:beforeSend', [xhr, settings]);
},
success: function(data, status, xhr) {
element.trigger('ajax:success', [data, status, xhr]);
},
complete: function(xhr, status) {
element.trigger('ajax:complete', [xhr, status]);
},
error: function(xhr, status, error) {
element.trigger('ajax:error', [xhr, status, error]);
}
};
// Only pass url to `ajax` options if not blank
if (url) { options.url = url; }
return rails.ajax(options);
} else {
return false;
}
},
{:month=>month_date.month,:year=>month_date.year}是传递给索引操作的参数。我的想法是远程可以工作,否则它不会查询数据库,对吗?@mcmullins错了。正在调用该操作。只是没有通过Ajax调用它。@YuriAlbuquerque好吧,它现在正在使用我设置的原始链接。它将响应一个javascript文件,但不响应渲染操作。所以我认为渲染是我的问题。@RadBrad虽然在link_to的文档中没有明确说明,但在它列出的文档中:remote作为一个html选项。这是有意义的,因为它只将数据远程属性添加到html标记中。