如何在rails 4.1中验证用于搜索目的的text_field_tag

时间:2014-09-06 07:18:20

标签: ruby-on-rails

homepage/index

<%= form_tag :controller => 'hotels', :method => 'get' do %>
<%= text_field_tag :search, nil, :class => 'search-box'%>           
<%= submit_tag "Search", :name=>'btnsearch' %>
<%end%>

hotels_controller

def index
     @hotels= Hotel.where('hotel_location LIKE ?',"%#{params[:search]}%")

我是Rails的新手,我想知道如何validate text_field_tag nil值。如果没有找到记录,则会显示错误消息而不重定向到< strong>酒店/指数页。

3 个答案:

答案 0 :(得分:1)

你的问题有些矛盾:

  

如果未找到记录,则显示错误消息   重定向到酒店/索引页面

您要求的是在您向应用发送请求后执行实现的功能,然后在不重定向的情况下显示消息?


<强>的Ajax

您最好使用Ajax (Asynchronous Javascript and XML)

enter image description here

这是一种发送方式。接收超出典型&#34; HTTP&#34;范围的请求请求(IE没有重新加载页面)。这听起来像您正在寻找的内容,因为它可以确保您无需再次重定向到index视图即可返回您想要的数据

Ajax的重要性在于它为许多HTTP开发人员提供了创建更多&#34; organic&#34;应用程序中的交互结构(IE不必每次都要重新加载页面)

Ajax实现起来非常简单 - 我推荐给你:

-

搜索

这就是我要做的事情:

#app/assets/javascripts/application.js
$(document).on("ajax:success", "#search", function(status, data, xhr){
    $(this).append(data);
});

#config/routes.rb
...
resources :hotels do
    get :search, on: :collection
end

#app/views/homepage/index.html.erb
<%= form_tag hotels_search_path, method: :get, id: "search", remote: true do %>
   <%= text_field_tag :search, nil, :class => 'search-box'%>           
   <%= submit_tag "Search", :name=>'btnsearch' %>
<% end %>

这将发送&#34; get&#34;请求hotels_search路径 - 这将允许您执行以下操作:

#app/models/hotel.rb
class Hotel < ActiveRecord::Base
    def self.search search
       results = where('hotel_location LIKE ?',"%#{search}%") if search
       if results
          return results
       else
          return "No Records"
       end
    end
end

#app/controllers/hotels_controller.rb
class HotelsController < ApplicationController
   respond_to :js, :json, :html
   def search
      @hotels = Hotel.search params[:search]
      respond_with @hotels, layout: false
   end
end

答案 1 :(得分:0)

  

如何验证text_field_tag是否为零。如果未找到记录,则显示错误消息,而不重定向到酒店/索引页面。

看起来您需要在客户端进行验证。您可以签出bootstrap validator,这非常适合在客户端使用验证。

如果你想编写自己的js来处理它,那么你可以这样做:

$(document).on("click","#your_btn_id",function(e){
  var textValue = $(this).closest(".search-box").val();
  if(textValue == ""){
    e.preventDefault();
    alert("Please enter some value");
  }
});

更新:

您也可以使用HTML5 validations,不需要任何js

<%= form_tag :controller => 'hotels', :method => 'get', :validate=>true do %>
  <%= text_field_tag :search, nil, :class => 'search-box', :required => true %>           
  <%= submit_tag "Search", :name=>'btnsearch' %>
<%end%>

如果您不想使用ajax,那么您可以这样做:

def index
  @hotels= Hotel.where('hotel_location LIKE ?',"%#{params[:search]}%")
  if @hotels
    #your action
  else
    flash[:notice] = "Please enter a valid value"
    render 'your_form_action'
  end
end

答案 2 :(得分:0)

由于Rails生成HTML5,我相信您可以利用其required属性将“搜索”文本框作为视图页面上的必填字段。像这样:

<%= form_tag :controller => 'hotels', :method => 'get' do %>
  <%= text_field_tag :search, nil, :class => 'search-box', :required => true %>           
  <%= submit_tag "Search", :name=>'btnsearch' %>
<%end%>

为了确保您的控制器在params[:search]中没有得到nil,您可以使用以下命令更改控制器的索引操作:

before_filter :validate_search, :only => [:index]

def index
  @hotels = Hotel.where('hotel_location LIKE ?',"%#{params[:search]}%")
  if @hotels.present?
    # other operation here!
  else
    redirect_to :back # will work only when referrer is present!
    rescue ActionController::RedirectBackError
      redirect_to root_path
  end
end

def validate_search
  if params[:search].nil?
    redirect_to root_path, notice: 'Enter few characters to search!'
  end
end