首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Sinatra和Sequel中实现活动记录,如'find‘方法?

如何在Sinatra和Sequel中实现活动记录,如'find‘方法?
EN

Stack Overflow用户
提问于 2013-04-05 02:52:06
回答 1查看 1K关注 0票数 0

我正在构建一个简单的Sinatra应用程序用于培训目的。

我正在使用续集gem,不想使用活动记录。

我的文件是:

/models/idea.rb:

代码语言:javascript
复制
class Idea
  attr_reader :id, :title, :description

  def initialize(input)
    @id = input[:id]
    @title = input[:title]
    @description = input[:description]
  end

  def save
    Idea.data.insert(title: title, description: description)
  end

  def self.create_table
    database.create_table? :ideas do
      primary_key :id
      String :title, size: 25
      Text :description
    end
  end

  def self.data
    verify_table_exists
    database[:ideas]
  end

  def self.database
    @database ||= Sequel.sqlite('./db/idea_box.sqlite3')
  end

  def self.all
    data.order(Sequel.desc(:id)).collect do |row|
      Idea.new(row)
    end
  end

  def self.verify_table_exists
    @table_exists ||= (create_table || true)
  end

  def self.find(params)
    data.where(id: params)
  end
# I also tried this:
#
#  def self.find(params)
#    data.where(id: params).collect do |row|
#      Idea.new(row)
#    end
#  end

  end
end

/views/edit.haml:

代码语言:javascript
复制
%h1 Edit idea
%form{action:"/#{@idea.id}", method: "post"}
  %input{type: "hidden", name: "_method", value: "put"}
  %input{type: "text", name: "idea_name", value: "#{@idea.title}"}
  %br
  %textarea{name: "idea_description", value: "#{@idea.description}"}
  %br
  %input{type: "submit", value: "Submit"}

application.rb:

代码语言:javascript
复制
require './models/idea'


Bundler.require

helpers do
  def title
    if @title
      "#{@tile} -- IdeaBox"
    else
        "IdeaBox"
    end
  end

  def delete_idea_button(idea_id)
    haml :_delete_idea_button, locals: {idea_id: idea_id}
  end
end



get '/' do
  @ideas = Idea.all
  haml :index
end

not_found do
  haml :error
end

post '/create' do


  idea = Idea.new(title: params['idea_name'], description: params['idea_description'])
  idea.save

  redirect to('/')
end

get '/edit/:id' do
  @idea = Idea.find(params[:id])
  @title = "Edit form"
  haml :edit
end

put ':id' do
  @idea = Idea.find(params[:id])
  @title = "Edit form"
  haml :edit
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-05 16:18:34

当您使用如下代码时,只需使用find方法即可:

代码语言:javascript
复制
def self.find(params)
  record = data[id: params]
  if record.nil?
    nil
    # or raise an exception...
  else
    self.new(record)
  end
end

但您还必须重新实现活动记录已经具有的一些功能,例如,使用某种persisted?方法来检查记录是否已经存在于数据库中,并更新记录,而不是创建新记录。

使用您当前的save实现,它将在您每次调用它时创建一条新记录。如果不是自己设置id,而是让数据库的auto_increment来处理,也会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15819368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档