我有一个控制器(不是模型相关的),它通过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>
我的'main'控制器中的索引操作如下所示:
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的新手,这是一个语法错误吗?
答案 0 :(得分:0)
这可能会有所帮助,值得一试。就我而言,我没有显示Flash消息,因为我正在使用
flash.now[:notice]
更改为
flash[:notice]
开始显示它。
完整代码,控制器:
def create
user_data = user_params
user_data[:password] = SecureRandom.uuid
@user = User.new(user_data)
@user.save
flash[:notice] = 'An email was sent for the user to confirm their account.'
respond_with(@user)
end
aaplication.html.erb
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= full_title(yield(:title)) %></title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= render 'layouts/shim' %>
</head>
<body>
<%= render 'layouts/header' %>
<div class="container">
<% flash.each do |message_type, message| %>
<div id=<%= message_type %> class="alert"><%= message %></div>
<% end %>
<%= yield %>
<%= render 'layouts/footer' %>
</div>
</body>
</html>