在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>酒店/指数页。
答案 0 :(得分:1)
你的问题有些矛盾:
如果未找到记录,则显示错误消息 重定向到酒店/索引页面
您要求的是在您向应用发送请求后执行仅实现的功能,然后在不重定向的情况下显示消息?
<强>的Ajax 强>
您最好使用Ajax (Asynchronous Javascript and XML):
这是一种发送方式。接收超出典型&#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