Как мне создать форму поиска для моих постов с Sinatra и Sequel?

Я новичок в Ruby и использую Sinatra и Sequel. Я пытаюсь реализовать форму для поиска по названию моих сообщений.

Я делаю это в своем контроллере:

post '/search'  do
@post = Post.all(:Title.like => "%#{params[:query]}%")
erb :layout
end

И я делаю это в своем layout.erb:

<form action="/search" method="get">
 <input type="text" name="query"/><br />   
 <input type="submit" />
</form>
<% if @results %>
 <table>
  <%@results.each do |r|%>
  <tr valign="top">
  <td><%=r.Title%></td>
  </tr>
  <%end%>
 </table>
<% end %>

Когда я отправляю, это URL-адрес, на который я перенаправляюсь:

http://localhost:4567/search?query=post 

но он отображает «Синатра не знает этой песенки». экран.

Что мне здесь не хватает?


person uklp    schedule 09.12.2013    source источник
comment
Важно использовать правильную терминологию. Sequel — это не база данных, это Object-Relational-Mapper, что-то вроде очень умный слой интерфейса базы данных. Sequel находится между вашим кодом и базой данных.   -  person the Tin Man    schedule 09.12.2013
comment
Да, я имел в виду это. Спасибо за исправление. У вас есть идеи для моей проблемы?   -  person uklp    schedule 09.12.2013


Ответы (1)


Ваша форма выполняет HTTP GET

<form action="/search" method="get">

но ваше действие Sinatra определено для получения запросов HTTP POST.

post '/search'  do

Я думаю, что вас смущает то, что у вас есть класс с именем Post. Get и post в действиях — это не имена классов, а действия REST. Просмотрите маршрутизацию.

person Steve Wilhelm    schedule 09.12.2013
comment
Спасибо за ваш ответ. Но мой POST в POST.all на самом деле является именем класса для сообщений, которые я использовал, а GET AND POST, используемые для маршрутов и формы, являются действиями REST. Если бы вы могли помочь мне с этим поиском, пожалуйста. Я мог бы дать вам свой репозиторий, чтобы вы могли попробовать его сами, чтобы лучше понять мою проблему. - person uklp; 09.12.2013
comment
Этот ответ объясняет проблему, поэтому внимательно прочитайте, что сказано в ответе. post '/search' не имеет ничего общего с вашей базой данных. Он имеет все отношение к тому, как Sinatra реагирует, когда браузер отправляет данные Sinatra. Ваша форма говорит браузеру использовать запрос get, поэтому вы получаете маленькую страничку Синатры. - person the Tin Man; 09.12.2013
comment
Я пришел к этому решению после этого вопроса-ответа: stackoverflow.com/questions/5747670/ Я ошибаюсь? Спасибо за терпение со мной. - person uklp; 09.12.2013
comment
Жестянщик говорит, что у вас есть форма, отправляющая HTTP GET, но вы сказали Sinatra создать обработчик HTTP POST для пути /search. В упомянутых комментариях вопрос-ответ действительно была ошибка, <form action="/search" method="post"> был правильным и не должен быть изменен. Как только вы это заработаете, Синатра должен вызвать действие поиска. Он создаст массив сообщений как @post, но ваше представление ожидает массив с именем @results. Вы также захотите это исправить. - person Steve Wilhelm; 09.12.2013
comment
Я исправил обе проблемы, которые вы мне посоветовали, я отправляю HTTP POST из формы, а также Sinatra для создания обработчика HTTP POST для пути /search. Кроме того, имена моих массивов теперь похожи. Но я получаю сообщение об ошибке "неопределенный метод "как" для :Title:Symbol". ЗАРАНЕЕ СПАСИБО. - person uklp; 09.12.2013
comment
Вы должны принять этот ответ и отправить другой вопрос о том, как выполнить запрос Sequel с подобным - person Steve Wilhelm; 09.12.2013
comment
Готово. Спасибо за вашу помощь в руководстве меня. Можете ли вы также помочь мне с этим сейчас, пожалуйста: stackoverflow.com/questions/20474810/ - person uklp; 09.12.2013