2016-08-20 76 views
2

我對軌道有點新鮮。我現在正在製作經典的twitter副本。我想在我的主頁上有一個搜索欄,允許用戶搜索嘰嘰喳喳句柄,如果句柄存在,它會將用戶發送到該嘰嘰喳喳句柄的顯示頁面。搜索框在軌道中找到用戶

我一直在關注如何實現一個簡單的搜索RailsCast,而不是像在視頻索引上做它,我想在展會行動。儘管我遇到了一些問題。該表單位於我的用戶索引視圖中。 以下是錯誤:

ActionController::UrlGenerationError in Users#index 
Showing c:/Sites/Projects/twitterapp/twitter/app/views/users/index.html.erb where line #2 raised: 

No route matches {:action=>"show", :controller=>"users"} missing required keys: [:id] 

這裏是形式:

<%= form_tag(user_path, method: 'get') do %> 
     <%= text_field_tag(:search, params[:search]) %> 
     <%= submit_tag("Search", name: nil) %> 
<% end %> 

這裏是我的表演動作:

def show 
     @user = User.search(params[:search]) 
end 

這裏是我的搜索方法在我的用戶模型:

def self.search(search) 
     if search 
      find(:all, conditions:['name LIKE ?', "%#{search}%"]) 
     else 
      find(:all) 
     end 
end 

回答

0

實際上,您不能使用show方法作爲搜索結果查找程序。根據軌道約定,因爲: 對於任何resourceusers,導軌支架產生指數顯示創建更新的基礎上刪除你的路由文件方法。

因此,基於傳統的方式,show方法總是要求object。可以說你正在使用UserContoller顯示方法。它要求一個user對象。你沒有在表格中提供。這就是爲什麼:id缺少錯誤給出。

我會告訴你做更多的學習。並且爲了搜索,在不同的控制器中創建不同的方法,並將該控制器方法定義爲routes.rb文件。這是最好的辦法。 如果您仍想使用show方法,請更改routes.rb文件中show方法的路由。您必須手動在路由文件中聲明show操作。

0

您使用user_path和路徑需要從當前用戶

通知ID,你可以在行動中做到這一點:索引,但我建議你創建這個

視圖

一個動作
<%= form_tag(search_users_path, method: 'get') do %> 
     <%= text_field_tag(:search, params[:search]) %> 
     <%= submit_tag("Search", name: nil) %> 
<% end %> 

routes.rb

resources :users do 
    post 'search', :on => :collection 
end 

users_controller。RB

def search 
    @user = User.search(params[:search]) 
end 

你應該創建search.html.erb類似index.html.erb

0

動車組和佈雷諾指出是什麼導致了問題user_path需要用戶id

解決方案的想法一個觀點: 爲什麼不只是指向用戶索引操作?像這樣:

<%= form_tag(users_path, method: 'get') do %> 
     <%= text_field_tag(:search, params[:search]) %> 
     <%= submit_tag("Search", name: nil) %> 
<% end %> 

users_controller.rb:

def index 
    if params[:search] 
     @user = User.search(params[:search]) 
    end 
end 

,您可以使用ajaxremote: true來處理返回的用戶對象