gpt4 book ai didi

javascript - 使用 Selectize 和 Ajax 时在 Bootstrap 模式中显示 Rails 错误消息

转载 作者:数据小太阳 更新时间:2023-10-29 04:51:54 25 4
gpt4 key购买 nike

我正在尝试构建一个应用程序,允许用户分享艺术家对其他艺术家的名言。例如,鲍勃·迪伦 (Bob Dylan) 引用约翰·列侬 (John Lennon) 的话。因此,我的艺术家模型的设置方式允许艺术家既是引述的演讲者又是引述的主题,并且每个引述都属于作为引述者或主题的每个艺术家。

当使用 Selectize 触发模态时,我无法在 Bootstrap 模态中显示 Rails 错误消息。我按照 this demo 使模态正常工作.

模态框用于创建一个新的Artist来自 quotes/new表单,但我无法获得 Artist 的错误消息在 Bootstrap 模式或报价/新页面上显示的模型。当我尝试在模式中创建触发错误消息(例如 validates_uniqueness)的内容时,它只是关闭模式并且不显示错误消息。其他一切都按预期工作。

将 Ajax 请求连接到 View 时我缺少什么?

这是我表单的相关部分:

<%= f.label :speaker, 'Who said it?' %>
<%= f.collection_select :speaker_id, @speakers, :id, :name,
{prompt: 'Select an artist'}, {class: 'form-control selectize-speaker'} %>

quotes/form.html.erb 的完整来源

这是我 Controller 中的相关代码:

class ArtistsController < ApplicationController
def create
@artist = current_user.artists.build(artist_params)
authorize @artist

respond_to do |format|
if @artist.save
if request.referer.include?("artists")
flash[:success] = "Artist was successfully created."
format.html { redirect_to @artist }
else
format.json { render json: @artist }
end
else
format.html { render :new }
format.json { render json: @artist.errors.full_messages }
end
end
end
end

artists_controller.rb 的完整来源

相关javascript代码:

$(document).on('turbolinks:load', function() {

var selectizeCallback = null;

// Selectize Speaker
$('.speaker-modal').on('hide.bs.modal', function(e) {
if (selectizeCallback != null) {
selectizeCallback();
selecitzeCallback = null;
}

$('#new_speaker').trigger('reset');
});

$('#new_speaker').on('submit', function(e) {
e.preventDefault();
$.ajax({
method: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(response) {
selectizeCallback({value: response.id, text: response.name});
selectizeCallback = null;

$('.speaker-modal').modal('toggle');
}
});
});

$('.selectize-speaker').selectize({
create: function(input, callback) {
selectizeCallback = callback;

$('.speaker-modal').modal();
$('#speaker_name').val(input);
}
}); // end selectize speaker
}); // end document on

quotes.js 的完整来源.

我的错误信息部分,shared/_error_messages.html.erb:

<% if object.errors.any? %>
<div id='error_explanation'>
<div class='alert alert-danger'>
<button type='button' class='close' data-dismiss='alert'>&times;</button>
<p><strong>The form contains
<%= pluralize(object.errors.count, 'error') %>.</strong></p>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
</div>
<% end %>

其他源文件:

models/quote.rb

models/artist.rb

controllers/quotes_controller.rb

最佳答案

成功和不成功的保存都会返回 200 响应,这意味着您的 success 回调将被调用:

  success: function(response) {
selectizeCallback({value: response.id, text: response.name});
selectizeCallback = null;

$('.speaker-modal').modal('toggle');
}

这总是切换模式,因此关闭它。

如果您确保在验证错误时响应是 4xx,那么您可以定义一个 error 回调,它会填充您的错误列表并且不会 关闭模式。

所以代替:

format.json { render json: @artist.errors.full_messages }

使用类似的东西:

format.json { render json: @artist.errors.full_messages, status: :bad_request }

然后,将一个error 回调传递给您的 AJAX 调用:

error: function(response) {
// somehow populate your errors list
// display the errors list
}

不过,这现在行不通,因为错误容器不存在:您只能在这种情况下呈现它:

object.errors.any?

在初始加载时,它将始终评估为 false。相反,您可以做的是始终呈现错误容器,如果没有任何错误,则将其默认为某个隐藏类,然后在您的 error 回调中,在填充后删除隐藏类。

关于javascript - 使用 Selectize 和 Ajax 时在 Bootstrap 模式中显示 Rails 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51737718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com