【发布时间】:2013-06-10 12:08:40
【问题描述】:
我有一个控制器(与模型无关),它通过 API 在 YouTube 上搜索内容。我想要达到的目的很简单......如果有人在没有输入任何字符串的情况下点击搜索按钮,那么会出现一个提示“请输入搜索字符串”。
“主”视图如下:
<%= form_tag({:controller => 'main', :action => 'index'}, :method => 'get') do %>
<%= label_tag(:text, 'Search:') %>
<%= text_field_tag(:text) %>
<%= submit_tag('Search') %>
<% end %>
<div id="flash">
<% if flash.now[:notice] %>
<p id="notice"><%= flash.now[:notice] %></p>
<% end %>
</div>
我的“主”控制器中的索引操作如下所示:
def index
if params[:text].blank?
flash.now[:notice] = 'Please enter a search string'
render 'index'
else
#do searches on YouTube
end
我也在 stackoverflow 上查看了与此类似的其他问题,并尝试了一些方法,但仍然无法正常工作。我玩过使用 flash[] 与 flash.now[] 的方法,即使我第一次加载页面时,通知消息仍然存在。我可能在这里遗漏了一些非常微不足道的东西,但我花了一段时间才弄清楚但仍然卡住了。无论如何,我们将不胜感激。
更新: 好的,我找到了答案。我只是在视图中的表单中添加了以下内容:
<%= hidden_field_tag :searching, true %>
然后我将控制器更改为:
flash.now[:notice] = 'Please enter a search string' if params[:searching]
这很好用。这是由这里的答案提供的: How do I stop a flash error message from showing on page load until after button is clicked in ruby on rails?
后续问题:在上面的链接中,它提出了一个更简洁的答案:
params[:search].blank? && !params[:search].nil?
但是,这对我不起作用。我得到了错误:
undefined method `gsub' for nil:NilClass
我是 Ruby 新手,这是语法错误吗?
【问题讨论】:
-
第一件事,你为什么要显式调用
render 'index'?你的问题到底是什么?即使您在params[:text]不为空的情况下调用操作,您是否会收到通知? -
初次加载页面时,会有params[:text]吗?
-
嗨 Marek,我尝试了 redirect_to,但它卡在了一个循环中。你有什么理由问我为什么使用渲染“索引”?问题是闪存通知是永久存在的。即使 params[:text] 不为空,我也会收到 Flash 通知。抱歉,我对这一切还是很陌生...
-
嗨 Vimsha,当我第一次加载页面时,搜索框中不会有默认值,因此它将是空白的。我之前考虑过,但我认为该方法只会在我点击搜索按钮后检查 param[:text] 是否为空白?
标签: ruby-on-rails flash messages notice