Я работаю над созданием простейшего вики-сайта с использованием 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
Что вы хотите сказать, создав новые объекты? Вы имеете в виду, что он создает новую запись в таблице? Это было бы очень странно, поскольку я не вижу, чтобы какой-либо метод создания или сохранения вызывался внутри индекса. И если вы имеете в виду каждый раз, когда вы посещаете путь */documents /: document_id/versions * в браузере, то я думаю, что это не что-то неожиданное, вам нужно инициализировать объект каждый раз, когда вы делаете запрос, правильно. – Surya
Как создавать версии, обратный вызов на 'Документ'? – Kris
Возможно, у объекта документа есть ответ. Можете ли вы опубликовать его? –