2017-03-23 44 views
1

我在我的Rails 5應用程序中有一個搜索控制器,如果搜索項是空白的,我希望它返回一個400狀態的頭部,但是否則搜索並呈現結果頁面。如何從控制器操作返回一個頭而不呈現其默認視圖?

這裏是我的控制器......

def new 
    search_term = search_params[:search].downcase 
    head 400 and return if search_term.blank? 

    @search_results = Post.where("lower(title) LIKE ? OR link LIKE ?", 
           "%#{search_term}%", 
           "%#{search_term}%"). 
         order("created_at DESC"). 
         paginate(page: params[:page], per_page: 30) 
    if @search_results.empty? 
    flash.now[:information] = "No results found" 
    end 
end 

private 

    def search_params 
    params.require(:search).permit(:search) 
    end 

我試圖調整,如果和返回語法,但似乎沒有任何工作。當我從視圖中單擊搜索按鈕而沒有搜索字符串時,它只會呈現控制器路徑下的空白頁面。我希望它只停留在同一頁面上,什麼也不做。

回答

1

實際編寫

params.require(:search).permit(:search) 

使得在場,而不是空白需要search PARAMS。

爲了使工作改變它後面一點點邏輯和不使用強參數(你手動檢查它):

search_term = params[:search] 
head 400 and return if search_term.blank? 
search_term.downcase! 

或者你也可以採取例外的優勢,通過寫,而不是:

rescue_from ActionController::ParameterMissing, with: :render_error 

def new 
    search_term = search_params[:search].downcase! 
    (rest of your code) 
end 

protected 

def render_error 
    head 400 
end 

但這可以被認爲是一些反模式。不過,我相信這裏適合,而且確實很明確。

+0

第一個示例沒有解決問題,它仍然在搜索路徑下呈現空白頁。使用第二種解決方案時,絕不會觸發異常,並且所有記錄都會返回到頁面上。一定有辦法! –

+0

'它仍然在搜索路徑下呈現一個空白頁面 - 這看起來像是一個發送400頭部空白主體的完美例子 – Esse

+0

我在其他地方看過瀏覽器假設2型和4型響應代碼將帶有一個新頁面來呈現。我嘗試過使用303等,但沒有運氣。我用'render:back'得到了我想要的東西,但是ux有點兒不舒服。想想我會建立一些Jquery並讓Ajax處理它。 –

相關問題