2016-08-20 8 views
2

Я немного новичок в рельсах. Сейчас я собираюсь сделать классический твиттер-клон. Я хочу иметь панель поиска на моей домашней странице, которая позволяет пользователю искать твиттер, и если дескриптор существует, он отправит пользователя на страницу показа этого твиттера.Поле поиска, чтобы найти пользователя в рельсах

Я слежу за RailsCast за то, как реализовать простой поиск, но вместо того, чтобы делать это на индексе, таком как видео, я хочу сделать это в действии show. Однако я столкнулся с некоторыми проблемами. Форма находится на моем индексном указателе пользователя. Здесь ошибка:

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 в качестве искателя результатов поиска. Поскольку в соответствии с соглашением рельсов: Для любого resource как users, рельсы эшафота создает индекса, нового, показать, создать, обновления, удалить метод, основанные на ваших маршруты файлов.

Таким образом, исходя из обычного способа, метод show всегда запрашивает object. Допустим, вы используете метод show UserContoller. Он запрашивает объект user. Которые вы не предоставили в форме. поэтому :id отсутствует ошибка.

Я бы сказал вам сделать еще несколько уроков. И для поиска создайте другой метод в другом контроллере и определите этот метод контроллера для файла routes.rb. Это лучший способ сделать это. Если вы все еще хотите использовать метод show, измените метод show методов из файла routes.rb. Вы должны вручную объявить действие show в файле маршрутов.

0

вы используете user_path и путь необходимо сообщить идентификатор от данного пользователя

вы можете сделать это в действии: индекс, но я рекомендую вам создать действие этой

зрения

<%= 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.Р.Б.

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 для обработки возвращенного объекта пользовательскому

0

Найдено свой вопрос с помощью Google, но ответы и предложения не работал для меня. Нашел еще одно решение, которое, похоже, стоит опубликовать здесь.

«Поиск и фильтр Рельсы модели без Раздувания Вашего контроллера»: http://www.justinweiss.com/articles/search-and-filter-rails-models-without-bloating-your-controller/

Смежные вопросы