2014-11-11 5 views
0

Я работаю над созданием простейшего вики-сайта с использованием Sinatra и ActiveRecord. У меня проблема, когда каждый раз, когда я пытаюсь загрузить индексный вид для версий конкретного документа, создается новая версия. Я взглянул на свои маршруты и модель моей версии, но просто не могу понять, хотя это, вероятно, что-то вопиющее (я новичок). Любая помощь будет оценена :) Некоторые из соответствующего кода:ActiveRecord при создании новых объектов каждый раз при загрузке index.erb

VERSIONS_CONTROLLER.rb

# =============== 
# Versions 
# =============== 

# INDEX 

get '/documents/:document_id/versions' do 
    @document = Document.find(params[:document_id]) 
    @versions = Version.where(["document_id = ?", params[:document_id]]) 
    erb :'versions/index' 
end 

# NEW 
get '/documents/:id/versions/new' do 
    @authors = Author.all() 
    @document = Document.find(params[:id]) 
    erb :'versions/new' 
end 

# SHOW 
get '/documents/:document_id/versions/:id' do 
    # @versions = Version.find(params[:document_id]) 
    @document=Document.find(params[:document_id]) 
    @version = Version.find(params[:id]) 
    erb :'versions/show' 
end 

# CREATE 
post '/documents/:document_id/versions' do 
    version = Version.new(params[:version]) 
    document.update(body: version.content) 
    version.save 
    redirect("/documents/#{ params[:document_id] }") 
end 

# REVERT 

# The revert function is going to post to 
# the create function above. It is going to 
# do this via a revert button under each 
# button on the versions/index.erb page. 
# When pressed, the button will post a 
# /documents/:document_id/versions form 
# with the params[:document_id][:version] 
# set to equal those of the version under 
# which the button is located 

ВЕРСИИ/INDEX.ERB

<div class="versions-index-wrapper"> 
    <div class="versions-index-header"> 
     <h1> 
      Version history for document: <%= @document.title %> 
     </h1> 
    </div> 
    <div class="versions-index-list"> 
      <% @versions.each do |version| %> 
       <li> 
        <a href="/documents/<%= @document.id %>/versions/<%= version.id %>"> 
        COMMIT: <%= version.blurb %><hr> 
        CREATED AT:<%= version.created_at %><hr> BY: 
        <%= version.author.username %><hr> 
        </a> 
       </li> 
      <% end %> 
    </div> 
</div>. 

ВЕРСИИ МОДЕЛИ

class Version < ActiveRecord::Base 
    belongs_to :document 
    belongs_to :author 
    has_many :comments, dependent: :destroy 

    def self.latest 
     self.order("created_at DESC") 
    end 

end 

SCHEMA

DROP TABLE IF EXISTS comments CASCADE; 
DROP TABLE IF EXISTS versions CASCADE; 
DROP TABLE IF EXISTS documents CASCADE; 
DROP TABLE IF EXISTS authors; 

CREATE TABLE authors (
    id SERIAL PRIMARY KEY, 
    first_name VARCHAR(255), 
    last_name VARCHAR(255), 
    username VARCHAR(255), 
    points INTEGER, 
    icon_url VARCHAR(255), 
    github_url VARCHAR(255), 
    twitter_url VARCHAR(255) 
); 

CREATE TABLE documents (
    id SERIAL PRIMARY KEY, 
    title VARCHAR(255), 
    img_url VARCHAR(255), 
    created_at TIMESTAMP, 
    updated_at TIMESTAMP, 
    author_id INTEGER, 
    body TEXT 
); 

CREATE TABLE versions (
    id SERIAL PRIMARY KEY, 
    blurb TEXT, 
    content TEXT, 
    created_at TIMESTAMP, 
    document_id INTEGER references documents, 
    author_id INTEGER references authors 
); 

CREATE TABLE comments (
    id SERIAL PRIMARY KEY, 
    created_at TIMESTAMP, 
    version_id INTEGER references versions, 
    author_id INTEGER references authors, 
    content VARCHAR(512) 
); 

DOCUMENTS.rb

class Document < ActiveRecord::Base 
    has_many :versions, dependent: :destroy 
    has_many :authors, through: :versions 
    after_initialize :init 

    def init 
     last_updated = Time.now.utc.iso8601.gsub('-', '').gsub(':', '') 
     self.versions << Version.create({ 
      content: "version 1.0", 
      blurb: "v1.0", 
      author_id: Author.first.id 
      }) 
    end 

    def self.latest 
     self.order("updated_at DESC") 
    end 

    def self.alphabetical 
     self.order("title ASC") 
    end 

end 
+0

Что вы хотите сказать, создав новые объекты? Вы имеете в виду, что он создает новую запись в таблице? Это было бы очень странно, поскольку я не вижу, чтобы какой-либо метод создания или сохранения вызывался внутри индекса. И если вы имеете в виду каждый раз, когда вы посещаете путь */documents /: document_id/versions * в браузере, то я думаю, что это не что-то неожиданное, вам нужно инициализировать объект каждый раз, когда вы делаете запрос, правильно. – Surya

+0

Как создавать версии, обратный вызов на 'Документ'? – Kris

+0

Возможно, у объекта документа есть ответ. Можете ли вы опубликовать его? –

ответ

0

after_initialize обратного вызова работает каждый раз объект ActiveRecord загружается в Rails. Поскольку ваше приложение загружает документ по каждому запросу, ваш метод init вызывается каждый раз, генерируя новую версию.

+0

ах, вот что происходит .. большое спасибо! – infinityfarm