【问题标题】:How to display contents from a sequel database connection in the view file in Ruby?如何在 Ruby 的视图文件中显示来自后续数据库连接的内容?
【发布时间】:2014-03-21 00:35:41
【问题描述】:

我正在尝试使用 Sinatra 中的 Sequel 从 PostgreSQL 数据库中检索数据。

DB = Sequel.connect('postgres://connection_data')
项目 = DB[:项目]

然后我尝试获取具有特定 ID 的条目:

get '/:id' do
   @item = items.filter(:id => params[:id]) 
   erb :edit
end

在我的编辑视图中,我想显示@item 变量的内容。问题是我不知道如何获取 ID。

<% 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 #&lt;Sequel::Postgres::Dataset:0x007fac118b7120&gt;。从@item 变量中检索值的正确方法是什么?

【问题讨论】:

    标签: ruby database postgresql sequel


    【解决方案1】:

    @item = items.filter(:id =&gt; params[:id]) 返回一个数据集。如果你想要一个单品,你应该这样做:@item = items.first(:id =&gt; params[:id].to_i)

    另外@item.id 可能不是你想要的。鉴于items = DB[:items],您使用的是普通数据集,然后@item = items.first(:id =&gt; params[:id].to_i) 会给您一个哈希值。您需要通过@item[:id] 获取项目的ID。

    您可能想改用模型:

    # model file
    class Item < Sequel::Model; end
    
    # sinatra code
    @item = Item[params[:id].to_i]
    
    # template
    @item.id
    

    【讨论】:

    • 谢谢,在您的示例中,我会将创建数据集的部分放在哪里?
    • 您知道我在哪里可以找到有关如何管理项目的示例吗?因为不知何故,我感觉每个人都以不同的方式做事。例如,有些根本不使用模型......
    【解决方案2】:

    其实@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] 给出了一个字符串,所以将它转换为一个整数。

    【讨论】:

    • 谢谢,我改了,但我仍然收到错误“未定义的方法 'id' for #<:postgres::dataset:0x007fac118b7120>
    • 你能发布你的表描述吗?这似乎是一个愚蠢的问题,但你确定“items”表有一个“id”属性吗?
    • 是的,我确定,我的表由三列组成,“id”、“name”和“price”,它有三行。计算我的数据或计算平均值都可以正常工作,因此数据确实存在。
    • 同样的错误,我忘了提到我正在使用 Heroku 来部署我的文件。当我尝试使用 .type 找出 params[:id] 是什么类型时,我收到了这个奇怪的错误消息:NoMethodError - undefined method 'type' "favicon.ico":String 似乎id 是一个包含“favicon.ico”的字符串。当我所做的只是打开 URL myproject.herokuapp.com/1 时,这怎么可能?
    • 这绝对不应该发生,因为 .to_i 方法只返回一个值。我建议在 Sequel 的邮件列表中询问。 groups.google.com/forum/#!forum/sequel-talk
    猜你喜欢
    • 2013-01-14
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2015-07-29
    相关资源
    最近更新 更多