Mar*_*rry 5 jquery simple-form twitter-bootstrap ruby-on-rails-3.2
我在这里和这里找到了类似的StackOverflow问题,但仍然无法使其工作.
我正在使用Rails 3.2.8,SimpleForm 2.0.4和Twitter Bootstrap 2.1.1(通过bootstrap-sass gem 2.1.1.0).
用户应该能够从模态弹出窗口添加联系人.如果存在验证错误,它们应该显示为内联,就像用户使用表单的非模态版本(字段周围的红色边框,字段旁边的错误消息)一样.
我像这样加载模态:
<a data-toggle="modal" data-target="#new-contact-modal">Go modal!</a>
Run Code Online (Sandbox Code Playgroud)
这是Bootstrap模式,它调用contacts/contact_fields
非模态版本中使用的相同部分.app/views/contacts/_new_modal.html.erb:
<div id="new-contact-modal" class="modal hide fade" tabindex="-1"
role="dialog" aria-labelledby="new-contact-modal-label"
aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-hidden="true">×</button>
<h3 id="new-contact-modal-label"><%= t("contacts.new.header") %></h3>
</div>
<%= simple_form_for(@contact,
:remote => true,
:html => {:class => "form-horizontal",
"data-type" => :json }) do |contact_form| %>
<div id="new-contact-body" class="modal-body">
<%= render 'contacts/contact_fields', :f => contact_form %>
</div>
<div class="modal-footer">
<%= contact_form.submit :class => "btn btn-primary",
:"data-loading-text"=> ('simple_form.creating') %>
<%= t('simple_form.buttons.or') %>
<a data-dismiss="modal" aria-hidden="true">
<%= t('simple_form.buttons.cancel') %>
</a>
</div>
<% end %>
</div>
Run Code Online (Sandbox Code Playgroud)
app/controllers/contacts_controller.rb(format.json
因为我试图使用JavaScript发回整个模态,故意注释掉了这一行):
def create
@contact = Contact.new(params[:contact])
<...some additional processing...>
respond_to do |format|
if @contact.save
format.html { flash[:success] = "Contact added."
redirect_to @contact }
format.json { render json: @contact, status: :created, location: @contact}
else
format.html { render action: "new" }
#format.json { render json: @contact.errors, status: :unprocessable_entity }
format.js { render 'new_modal_error' }
end
Run Code Online (Sandbox Code Playgroud)
应用程序/视图/联系人/ new_modal_error.js.erb
var modal = "<%= escape_javascript(render :partial => 'contacts/new_modal', :locals => { :contact => @contact.errors }) %>";
$("#new-contact-modal").html($(modal));
Run Code Online (Sandbox Code Playgroud)
app/assets/javascripts/contacts.js一些JQuery重置表单并关闭成功模式.
$(function($) {
$("#new_contact")
.bind("ajax:success", function(event, data, status, xhr) {
// http://simple.procoding.net/2008/11/22/how-to-reset-form-with-jquery :
$(this).each(function(){
this.reset();
});
$("#new-contact-modal").modal("hide");
})
});
Run Code Online (Sandbox Code Playgroud)
好消息是,当表单没有错误时,这可以工作:添加联系人并隐藏模态.但是,如果存在验证错误,则会收到消息"JSON.parse:unexpected character".这来自jquery.js,第515行,这是return
此代码段中的语句:
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
Run Code Online (Sandbox Code Playgroud)
如果我检查data
,我看到的是我的new_modal_error.js
文件的内容,完全扩展了表单错误,并转义为JavaScript.但它不是JSON.
我错过了什么?如何将页面new_modal_error.js
作为JavaScript文件处理,而不是JSON变量?或者是否有更简单的方法来处理这个问题?
这里的主要问题是调用表单data-type => :json
。这意味着它需要一个 JSON 响应,但我希望它传回 JavaScript。解决方案是设置data-type => :script
(或者只是将其保留并让 Rails 推断 JavaScript):
:html => {:class => "form-horizontal", \n "data-type" => :script }) do |contact_form| %>\n
Run Code Online (Sandbox Code Playgroud)\n\n感谢本文解释了各种数据类型,并澄清了数据类型是指响应而不是数据的提交:
\n\nRails 3 远程链接和表单第 2 部分:数据类型(使用 jQuery)
\n\n“jQuery\xe2\x80\x99s.ajax()
方法提供了一个可选参数,用于dataType
指定所需的响应数据类型。”
我认为@wanghq 指出的另一个问题是JQuery 的.html()
方法更新了对象的innerHTML 。我最终创建了一个仅包含表单的部分,在<div id="new-contact-form-wrapper">
包装器内调用该部分,然后定位包装器以替换表单:
var myForm = "<%= escape_javascript(render :partial => \'contacts/new_modal_form\', :locals => { :contact => @contact.errors }) %>";\n$("#new-contact-form-wrapper").html(myForm);\n
Run Code Online (Sandbox Code Playgroud)\n\n我仍在努力传递变量、成功清除表单等。由于我使用的是控制器中的部分内容,我可能会继续将所有 JQuery(成功和失败)放入所以我不需要app/assets/javascripts/contacts.js。
\n 归档时间: |
|
查看次数: |
6895 次 |
最近记录: |