Как отобразить содержимое подключения к базе данных сиквела в файле представления в 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] дает строку, поэтому преобразуйте ее в целое число.

Другие вопросы по тегам