Нет данных, полученных Sinatra при редактировании записи в блоге

#ruby #sinatra #slim-lang #sqlite3-ruby

#ruby #sinatra #slim-lang #sqlite3-ruby

Вопрос:

Я следую этому сообщению в блоге Sinatra, чтобы создать свой собственный блог на Ruby Sinatra, с той лишь разницей, что мои шаблоны находятся в slim, а не в ERB.

Проблема, с которой я сталкиваюсь, заключается в сохранении отредактированных сообщений. Сообщения фактически сохраняются, но они не перенаправляют меня на недавно отредактированную страницу, и Chrome выдает мне сообщение «Ошибка не получены данные», код ошибки: ERR_EMPTY_RESPONSE.

Итак, мой вопрос в том, как справиться с отсутствием полученных данных?

Маршруты Sinatra

 get '/posts/:id/edit' do
    @post = Post.find(params[:id])
    @title = 'Edit Post'

    slim :'posts/edit'
end

put '/posts/:id' do
   @post = Post.find(params[:id])
   if @post.update_attributes(params[:post])
     redirect '/posts/#{@post.id}'
   else
     slim :'posts/edit'
   end
end
  

Тонкий шаблон

 h1 Edit Post
  form action="/posts/#{@post.id}" method="post"
    input type="hidden" name="_method" value="put"

    label for="post_title" Title:
    input id="post_title" name="post[title]" type="text" value="#{@post.title}"

    label for="post_body" Body:
    textarea id="post_body" name="post[body]" rows="5" #{@post.body}

    input type="submit" value="Save"
  

Я использую sqlite3 для базы данных блога [как сказано в блоге].

Ответ №1:

О, вот ваша проблема: у вас есть #{...} перенаправление, но оно заключено в одинарные кавычки : ' . Ruby не интерпретирует интерполяции в одинарных кавычках, только в " двойных кавычках. Поэтому, если вы измените эту строку redirect "/posts/#{@post.id}" , она должна работать.

Комментарии:

1. Похоже, это зависит от того, какой сервер используется. Thin с радостью отправляет перенаправление на /posts/#{@post.id} (и именно поэтому я собирался прокомментировать, что этот ответ был неправильным), но с помощью Webrick (по умолчанию, если у вас не установлен другой сервер) он действительно вызывает исключение, в результате которого данные не возвращаются.

2. Я использовал shotgun в качестве сервера. И спасибо! Это сработало. Я не знал этого о Ruby.