2014-09-06 25 views
1

homepage/index我如何驗證用於搜索目的text_field_tag在Rails 4.1

<%= 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和我想知道的是如何validatetext_field_tagnil value.Means如果沒有找到記錄,則顯示錯誤消息而不重定向到酒店/索引頁面。

回答

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 
+0

Thanks.I有另外一個問題,如果我輸入一個無效的值,則我被重定向到「酒店/索引」頁面,我什麼都沒有。所以,我想驗證,如果什麼都沒有,那麼不要將我重定向到該頁面 – John 2014-09-06 07:39:11

+0

@John如果你想驗證它的不正確的值,那麼你將不得不改變你的用戶界面和使用AJAX或你可以做的是在裏面您的索引操作檢查酒店的價值,如果它爲零,則將用戶重定向到您的搜索頁面並顯示一些類似無效值的Flash消息。哪種選擇適合您的需求?將相應地更新我的答案 – Mandeep 2014-09-06 07:43:34

+0

@John我更新了我的答案非Ajax方式。讓我知道它是否適用於您 – Mandeep 2014-09-06 09:01:12

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]沒有得到零,您可以更改與控制器的index動作:

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 
1

你的問題是有點paradoxial:

如果未找到記錄,則顯示錯誤消息,但不顯示 重定向到酒店/索引頁

您要求的是在向您的應用程序發送請求並顯示消息而不重定向之後,執行的功能可以實現只有


阿賈克斯

你可能會用最好的Ajax (Asynchronous Javascript and XML)

enter image description here

這是送的典型的 「HTTP」 範圍之外&接收請求的方式請求(IE無需重新加載頁面)。這聽起來像你要找的東西,因爲它會確保你能夠返回你想要的數據而不需要重定向到您的index視圖。

阿賈克斯的重要性在於,它提供了許多HTTP開發人員提供了他們的應用程序中創建更多的「有機」的互動結構的能力(即不是有你想要做的事,每次刷新頁面)

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 %> 

這將發出一個「獲取」請求您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

您可能需要更改:where('hotel_location LIKE?',「%#{params [:search]}%」)'to this:'where('hotel_location LIKE?' 「%#{}搜索%」)'。 – Surya 2014-09-08 09:16:01

+0

謝謝 - 錯過了! – 2014-09-08 09:16:59