Ruby on rails的flash通知总是出现



我有一个控制器(不是模型相关),通过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。现在[],即使我第一次加载页面,通知信息仍然会出现。我可能在这里错过了一些相当微不足道的东西,但我花了一段时间弄清楚了,仍然卡住了。无论如何,我都很感激你的帮助。

更新:好的,我找到答案了。我只是在视图的表单中添加了以下内容:

    <%= hidden_field_tag :searching, true %>

然后我把控制器改成:

    flash.now[:notice] = 'Please enter a search string' if params[:searching]

这个工作正常。这是礼貌的回答:我如何阻止flash错误信息显示在页面加载,直到按钮在ruby on rails点击后?

后续问题:在上面的链接中,它建议了一个更简洁的答案:

    params[:search].blank? && !params[:search].nil?

然而,这对我不起作用。我得到错误:

    undefined method `gsub' for nil:NilClass

我是Ruby的新手,所以这是语法错误吗?

这可能有帮助,值得一试。在我的例子中,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>

最新更新