- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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: true
是 ajax要求。
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 %>;
你的新代码可以改进一点:
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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!