Как отобразить содержимое подключения к базе данных сиквела в файле представления в Ruby?
Я пытаюсь получить данные из базы данных PostgreSQL с помощью Sequel в Синатре.
DB = Sequel.connect ('postgres: // connection_data')
items = DB [: items]
Затем я пытаюсь получить запись с определенным идентификатором:
get '/:id' do
@item = items.filter(:id => params[:id])
erb :edit
end
В моем виде редактирования я хотел бы отобразить содержимое переменной @item. Проблема в том, что я не знаю, как получить, например, удостоверение личности.
<% if @item %>
<a href="/<%= @item.id %>/doit">Do something</a>
<% else %>
<p>Item not found.</p>
<% end %>
Я пытался использовать @item.id и @item[:id], но оба не работают. Я получаю ошибку undefined method 'id' for #<Sequel::Postgres::Dataset:0x007fac118b7120>
, Каков будет правильный способ получения значений из переменной @item?
2 ответа
@item = items.filter(:id => params[:id])
возвращает набор данных. Если вы хотите один элемент, вы должны сделать: @item = items.first(:id => params[:id].to_i)
Также @item.id
вероятно, не хочу, чтобы ты хотел. При условии items = DB[:items]
, вы используете простой набор данных, а затем @item = items.first(:id => params[:id].to_i)
собирается дать вам хэш. Вам нужно сделать @item[:id]
чтобы получить идентификатор предмета.
Вы можете посмотреть на использование моделей вместо:
# model file
class Item < Sequel::Model; end
# sinatra code
@item = Item[params[:id].to_i]
# template
@item.id
На самом деле @item.id
это правильный путь. Единственная проблема, которую я вижу в вашем коде:
@item = items.filter(:id == params[:id])
который должен быть
@item = items.filter(:id => params[:id].to_i)
РЕДАКТИРОВАТЬ:
Попробуй это:
@item = items.where(:id => params[:id].to_i)
@item.select(:id) #to embed
params [: id] дает строку, поэтому преобразуйте ее в целое число.