gpt4 book ai didi

ruby-on-rails - Rails respond_to 重定向不起作用

转载 作者:行者123 更新时间:2023-12-02 08:22:58 24 4
gpt4 key购买 nike

我的 Rails 应用程序中创建 Controller 中的 respond_to block 在成功保存时没有重定向...我确信这是一个简单的解决方案,但我对 Rails 缺乏经验,这是我第一次遇到这个问题。

表单设置为:remote => true, Controller 如下...

def create
@store = current_user.stores.new(store_params)

respond_to do |format|
if @store.save
format.html { redirect_to root_path }
else
format.html { flash[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}"
render "new" }
format.js {}
end
end
end

当我谈到这个主题时,条件的 else 部分的代码也不会运行,除了 format.js {},它确实在我的 create.js.erb 文件中运行代码(暂时是一个警报)。

我正在使用 Rails 4.2.5。有人可以帮我理解为什么重定向和警报不起作用吗?谢谢!

编辑以显示解决方案根据 Rich 的回答,这是我想出的解决方案:

Controller :

def create
@store = current_user.stores.new(store_params)

flash.now[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}" unless @store.save

respond_to do |format|
format.js
end

if @store.save
flash[:notice] = "New store created"
end
end

create.js.erb

<% if flash.now[:alert] %>
$("#alert_holder").empty();
$("#alert_holder").append("<%= j flash.now[:alert] %>");
<% else %>
window.location.href = "<%= root_url %>";
<% end %>

请注意,我需要在重定向 url 周围添加引号。

表单成功后,页面重定向到根目录。失败时,错误消息会闪烁,但表单不会刷新 - 用户输入的任何答案都会保留。

最佳答案

remote: trueajax要求。

Ajax 是 javascript,因此会调用 format.js 方法:

def create
@store = current_user.stores.new store_params

respond_to do |format|
if @store.save
format.js
format.html { redirect_to root_path }
else
format.js
format.html { flash[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}"
render "new" }
end
end
end

format.js 方法将调用 /app/views/[:controller]/[:action].js.erb 文件,该文件将触发任何你里面的JS。

如果您不想让 js 格式处理响应,则必须取消 respond_to 并只拥有您想要的返回(redirect_to 不起作用)。


Ajax

您需要了解以下几个规定:

  • Ajax cannot "redirect" (on its own)
  • Ajax will be treated as JS in your Rails controller
  • You have to "hack" the flash to get it working through JS

如果你没有 Ajax 的经验,简单的解释是它是一个“伪请求”;它无需重新加载浏览器即可发送 HTTP 请求。

Ajax 的模式很简单:Ajax 请求 > 服务器 > Ajax 响应

除非您使用 javascript 解析响应,否则您不能通过 Ajax “重定向”。正如 Ajax 首字母缩写词(Asynchronous Javascript And XML)所暗示的,响应应该是 XML(IE 没有功能)。

--

要回答您的问题,您需要使用 flash.now对于“flash”消息,并使用您的 .js.erb 文件处理响应:

def create
@store = current_user.stores.new store_params
flash.now[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}" unless @store.save

respond_to do |format|
format.js
format.html
end
end

这将允许您调用...

#app/views/stores/create.js.erb
<% if flash.now[:alert] %> alert("<%=j flash.now[:alert] %>"); <% end %>
window.location.href = <%= root_url %>;

Ref


你的新代码可以改进一点:

def create
@store = current_user.stores.new store_params

if @store.save
flash[:notice] = "New store created"
else
flash.now[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}"
end

respond_to do |format|
format.js
end
end

如果你想进一步DRY你的代码,你会想看看responders gem :

#app/controllers/stores_controller.rb
class StoresController < ApplicationController
respond_to :js, only: :create

def create
@store = ...
respond_with @store if @store.save
end
end

关于ruby-on-rails - Rails respond_to 重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35077441/

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