我正在使用Rails 3.2,我有一个表单,我希望它通过ajax发布并让控制器返回json.
我正在使用form_for帮助器,如下所示:
= form_for(@object, :remote => true, :format => :json) do |f|
....
Run Code Online (Sandbox Code Playgroud)
我的对象控制器create方法如下所示:
def create
respond_to do |format|
if @object.save
format.html { redirect_to @object }
format.json { render json: @object, status: :created, location: @object }
else
format.html { render action: "new" }
format.json { render json: @object.errors, status: :unprocessable_entity }
end
end
end
Run Code Online (Sandbox Code Playgroud)
表格按预期提交ajaxly.但是控制器正在返回html,而不是json!
使用firebug检查请求,并确定ajax请求中的Content-Type http标头设置为application/html.
围绕这个的文档非常稀疏,:format =>:json似乎只是将".json"附加到表单操作,而不是实际修改任何http标头.
我也尝试过:content_type =>:json没效果.
我不能简单地硬编码控制器来返回json,因为还有其他地方我希望它返回html ...
所以有人知道如何告诉控制器在使用form_for时渲染json吗?
谢谢你的帮助
我有一个奇怪的问题,JQuery正在为link_to方法创建两个AJAX请求.我正在使用JQuery for UJS开发Rails 3应用程序.我有一个切换链接,可以在"关注"和"取消关注"之间切换
我的链接呈现如下:
<span id="follow_link">
<a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Unfollow</a>
</span>
Run Code Online (Sandbox Code Playgroud)
我的控制器设置如下:
def tfollow_artist
@artist = Artist.find(params[:id])
if current_user.following?(@artist)
current_user.stop_following(@artist)
else
current_user.follow(@artist)
end
end
Run Code Online (Sandbox Code Playgroud)
最终将js呈现为:
$('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>');
Run Code Online (Sandbox Code Playgroud)
这基本上用相同的URL替换'<span id ="follow_link"> ... </ span>的html内容,只是文本不同.例如,上面将呈现为:
<span id="follow_link">
<a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Follow</a>
</span>
Run Code Online (Sandbox Code Playgroud)
然而,这在某种程度上导致JQuery发出两个AJAX请求.
任何人都可以看到这里有什么问题吗?
我正在使用'jquery-rails'gem,它正在将最新的jquery-ujs文件复制到我的应用程序中.JQuery版本是1.4.3
使用Rails 3.1 jquery_ujs,我有一个链接有:遥控=> true,并控制新的行动,JS响应和渲染new.js.erb其中包含:
$('#post-form').html('<%= escape_javascript(render(:partial => "form")) %>');
Run Code Online (Sandbox Code Playgroud)
它呈现_form.html.erb部分.这有效.
现在我想使用Coffeescript,但将new.js.erb重命名为new.js.coffee.erb不起作用.资产管道是否仅适用于app/assets?我究竟做错了什么?谢谢.
我有一个Rails Devise表单,它有javascript验证.当用户按下提交时,验证工作,用户重新聚焦在他们需要的表单上.
但是,rails使用data-disable-with在单击按钮后禁用该按钮,因此在验证后用户无法再单击提交.我试图设置某种监听器来检查按钮何时被禁用,等待一会儿以防止双击,然后重新启用按钮.
我尝试了很多代码迭代,我尝试的最新版本是:
$(document.on("ajax:success", "new_supplier", function() {
var button;
button = $(this).find('.btn-sign-up');
setTimeout((function() { return button.disabled=false; }),1);
});
Run Code Online (Sandbox Code Playgroud)
但是没有成功,之前我尝试过只为按钮添加一个监听器:
var button = document.getElementById('btn-sign-up');
button.addEventListener("click", enableButton);
function enableButton() {
if (button.disabled)
{
window.setTimeout(enable(), 2000);
}
}
function enable() {
button.disabled=false;
}
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为它在禁用按钮的功能(隐藏在rails ether中)之前运行,因此无效.
我的提交按钮很简单:
<%= f.submit "Create my account", class: 'btn-sign-up', id: 'btn-sign-up' %>
Run Code Online (Sandbox Code Playgroud)
有人可以帮我从这里出去吗?我想如果我可以为这个可以工作的页面禁用jQuery_ujs,但不确定我是否可以这样做.
当我查看Rails 3 jquery-ujs代码时,我注意到它绑定到自定义JavaScript事件(submit.rails,click.rails等).有谁知道这些自定义'.rails'事件的定义在哪里?我只是想更好地理解Rails 3中的UJS内容是如何工作的,这样我就可以更有效地使用它...
问题是我有一个远程表单,基于条件,id喜欢转换为非远程表单(使用UJS),然后提交.请注意表单上传了文件.
这是详细信息:我最初使用了远程表单
= form_for @myobj, :url => {:action=>"remoteAction", :controller=>"myobjects"}, :remote => true do |f|
... (f.fields....)
Run Code Online (Sandbox Code Playgroud)
它产生HTML:
<form id="new_myobj" class="new_myobj" method="post" accept-charset="UTF-8" data-remote="true" action="/remoteAction">
Run Code Online (Sandbox Code Playgroud)
当我点击提交时,正如预期的那样,表单被提交为"AS JS".在控制器动作中,我正在对提交的表单中的字段进行一些验证.如果所有验证都通过,我执行以下.js.haml模板:
$('form#new_myobj').removeAttr("data-remote");
$('form#new_myobj').attr('enctype', 'multipart/form-data');
$('form#new_myobj').attr('action', '/myobjects/regularAction');
Run Code Online (Sandbox Code Playgroud)
它成功地将页面上的HTML(通过Firebug见证)更改为:
<form id="new_myobj" class="new_myobj" method="post" accept-charset="UTF-8" enctype="multipart/form-data" action="/myobjects/regularAction">
Run Code Online (Sandbox Code Playgroud)
因为形式包含f.file_field,我必须提交尽可能多所以图像可以上传,我不能提交"AS JS"现在,当我点击提交,控制器行动"regularAction"确实叫,但它仍然'AS JS'
问题是,我还需要在HTML中进行哪些更改,以便可以非xhr提交表单?它与标题有关吗?
我正在使用Rails UJS.我有一个表单设置来执行远程提交,如下所示:
<form accept-charset="UTF-8" action="/subscriptions" class="new_subscription form-horizontal" id="new_subscription" data-remote="true" data-type="json" method="POST">
Run Code Online (Sandbox Code Playgroud)
我正试图找到一种从JavaScript函数提交此表单的方法.我试过了:
var form$ = $("#new_subscription");
form$.get(0).submit();
Run Code Online (Sandbox Code Playgroud)
但问题是它提交了没有遥控器的表单,它会发布到服务器并刷新页面.知道为什么会这样吗?是否有不同的方式提交远程表单?
谢谢
我正在尝试在我的Rails 3应用程序中添加一些Ajax功能.
具体来说,我想要一个按钮,它将提交一个Ajax请求来调用我的控制器中的远程函数,该控制器随后查询API并将JSON对象返回到页面.
收到JSON对象后,我想显示内容.
所有这些都采用了新的Rails 3 UJS方法.这个在线的某个地方有一个很好的例子/教程吗?我一直无法在谷歌上找到一个.使用按钮作为入口点(即,用户单击按钮以启动此过程)的简单示例也将起作用.
编辑 让我用不同的方法尝试这个.我想让这个按钮查询一个外部API,它返回JSON,并在页面上显示该JSON.我不知道从哪里开始.按钮本身是否查询外部API?我是否需要通过控制器,让控制器查询外部API,获取JSON,并将JSON返回到此页面?如何显示/访问此JSON的内容?老实说,我找不到一个好的Rails 3.x如何处理JSON的例子......
这是一个非常奇怪的问题.我有一个rails应用程序,其中我使用UJS替换页面上的一个部分.最近,它停止工作,所以我开始记录整个过程,看看它在哪里破了.这是我发现的:
这意味着它将一直运行.js.erb文件并评估ruby没有错误.但这有点奇怪 - 没有任何javascript正在执行.当我在.js.erb文件中运行警报('hello?')时,它没有执行.
有没有人遇到过这个问题?它会运行erb评估而不是js,这似乎非常奇怪.并且js控制台中也没有出现错误.
我有记录:清除缓存,重新启动浏览器,重新启动rails应用程序,没有任何改变.
示例代码:
# view
link_to 'example', some_path, :remote => true
# controller
respond_to do |format|
format.js
end
# .js.erb file
alert('this never shows up');
<% puts 'this shows up in the rails console' %>
Run Code Online (Sandbox Code Playgroud)
非常感谢任何能够对这个奇怪的问题有所了解的人!
我有一个form_tag(foo_path(@foo), remote: true, id: 'foo-form'
表单和一个提交按钮submit_tag ("Submit", :id => "foo-submit")
我想在点击后禁用提交按钮.显然,我不能使用像是onlick="jQuery(this).prop('disabled', true);"
因为它会破坏远程功能.我知道:disable_with
submit_tag 的data属性,但它似乎对我不起作用.它确实生成了正确的表单代码,但它没有任何效果.我不确定它为什么不起作用,但可能是因为我同时使用原型(遗留原因)和jquery.虽然,我只加载ujs
jquery而不是原型.但是,所有其他query_ujs
功能都可以很好地工作.
还有其他方法可以禁用提交按钮吗?