Javascript Rails 4:TurboLink使用flash重定向

Javascript Rails 4:TurboLink使用flash重定向,javascript,ruby-on-rails,ruby-on-rails-4,turbolinks,Javascript,Ruby On Rails,Ruby On Rails 4,Turbolinks,假设我有一个标准的控制器创建操作: def create @object = Object.new(object_params) if @object.save redirect_to @object, flash: {success: "Created object successfully."} else render :new end end 现在,如果我将重定向更改为使用TurboLink: redirect_to @object, turbolinks

假设我有一个标准的控制器创建操作:

def create
  @object = Object.new(object_params)
  if @object.save
    redirect_to @object, flash: {success: "Created object successfully."}
  else
    render :new
  end
end
现在,如果我将重定向更改为使用TurboLink:

redirect_to @object, turbolinks: true, flash: {success: "Created object successfully."}
服务器返回一个文本/javascript响应,我的浏览器将其显示为一个白色页面,上面只有这行文本:

Turbolinks.visit('http:/localhost:3000/objects/1');
如何使我的浏览器实际执行该代码,而不是将其显示为文本


另外,如何才能显示flash成功消息?

这不是对您问题的直接回答。但我建议使用不引人注目的JS。您需要首先在表单中添加
remote:true

def create
  @object = Object.new(object_params)
  if @object.save
    flash.now.success = 'Created object successfully.'
  else
    flash.now.alert = @object.errors.full_messages.to_sentence
  end
  render :js
end
创建仅包含以下内容的文件Create.js.erb:

$('#flash').replaceWith("<%= j render partial: 'layouts/flash' %>");
def create
  @object = Object.new(object_params)
  if @object.save
    flash.now.success = 'Created object successfully.'
  else
    flash.now.alert = @object.errors.full_messages.to_sentence
  end
  render partial: 'layouts/flash'
end
$('#myForm').ajaxForm({
    url : '<%= url_for objects_path %>',
    type: 'post',
    dataType : 'json',
    success : function (response) {
        $('#flash').replaceWith(response);
    }
});
然后在HTML中嵌入如下内容:

$('#flash').replaceWith("<%= j render partial: 'layouts/flash' %>");
def create
  @object = Object.new(object_params)
  if @object.save
    flash.now.success = 'Created object successfully.'
  else
    flash.now.alert = @object.errors.full_messages.to_sentence
  end
  render partial: 'layouts/flash'
end
$('#myForm').ajaxForm({
    url : '<%= url_for objects_path %>',
    type: 'post',
    dataType : 'json',
    success : function (response) {
        $('#flash').replaceWith(response);
    }
});
$('#myForm').ajaxForm({
url:“”,
键入:“post”,
数据类型:“json”,
成功:功能(响应){
$('#flash')。替换为(响应);
}
});

另外,您可能还感兴趣的是,究竟是哪一个已经完成了这项工作(部分视图加载;您指定要替换的目标容器)。因为目前turbolinks还没有部分加载的支持,所以它总是加载整个身体。

这就是我最终使用turbolinks解决这个问题的原因,也是为了一个很棒的flash UX:

在我的控制器中:

format.js {
  flash[:toast] = 'Created record successfully.'
  render :create
}
在create.js.erb中:

Turbolinks.visit("<%= success_path %>");
Turbolinks.访问(“”);
在my_flash.html.erb partial中:

<% flash.each do |type, message| %>
  <% if type == "toast" %>
    <script id="toast">
      $(function() {
        Materialize.toast('<%= message %>', 3000);
      });
    </script>
  <% elsif type == "success" %>
    ...
  <% elsif type == "alert" %>
    ... 
  <% end %>
<% end %>

$(函数(){
具体化。吐司(“”,3000);
});
...
... 

您是否有任何javascript错误导致浏览器实际提交表单,而不是TurboLink拦截提交事件并发送ajax请求?检查浏览器控制台。您创建对象的第一个请求是HTML格式的,因此您的浏览器希望收到HTML响应。但是您正在发送一个JS响应,它被解释为HTML。使用
标记包装您的Turbolinks重定向,或者不使用Turbolinks进行此重定向。不知何故,我记得不引人注目的javascript被贬低了?我可能错了。在任何情况下,我们的团队都不使用.js.erb方法……但我相信我可以通过html中的jquery live调用来实现这一点。我很想知道您从哪里了解到,
不引人注目的javascript被弃用了
,上次我检查时,非常推荐使用它。是的,您仍然可以将javascript嵌入HTML本身,而不需要远程调用(比如这个非结构化的JS)。然后,您将呈现部分HTML文件。我会尝试更新答案。我想你是对的。事实并非如此。这正是我们团队放弃的.js.erb方法。@GregBlass,我更新了代码。我不太相信这是最好的解决方案,但我认为它会起作用:)我让它起作用了,但你不能在
flash.now
上使用
.success
方法。因此,我不得不使用
flash[:success]=“Message”
。如果不使用
now
方法,它可以很好地工作。干杯