好吧,我有三个模型User
Document
和Folder
。
我使用了宝石Paperclip和Acts_as_tree。这一点是每个用户都能够创建一个带有附件的新文档。用户还可以创建文件夹,在该文件夹中,将有文档。
我遇到的问题是,当我尝试创建新文档时,我会收到错误"文件夹必须存在"。当我在一个文件夹中并且我正在创建一个新文档时,甚至会发生这种情况。我知道我在代码中遗漏了一些小东西,但我似乎无法得到它。我会展示我的代码。
文件控制器
class DocumentsController < ApplicationController
def new
folder = current_user.folders.find_by_id(params[:folder_id]) if params[:folder_id]
@document = current_user.documents.build({ folder: folder })
end
def create
@document = current_user.documents.new(document_params)
if @document.save
if @document.folder
redirect_to @document.folder
else
redirect_to folders_path
end
else
render :new
end
private
def
@folder = current_user.folders.find_by_id(params[:document][:folder_id]) if params[:document]
params.require(:document).permit(:upload_file, :folder_id, :user_id).merge(folder: @folder)
end
end
文档模型
class Document < ApplicationRecord
belongs_to :user
belongs_to :folder
has_attached_file :upload_file
validates_attachment_content_type :upload_file, content_type: /.*/
end
文件表格
<%= form_for @document, html: {:multipart => true} do |f| %>
<% @document.errors.full_messages.each do |msg| %>
<p><%= msg %></p>
<% end %>
<%= f.file_field :upload_file %>
<%= f.hidden_field :folder_id %>
<% end %>
文件夹模型
class Folder < ApplicationRecord
belongs_to :user
has_many :documents, :dependent => :destroy
acts_as_tree
end
答案 0 :(得分:1)
问题是belongs_to :folder
这意味着在保存文档对象之前,您必须拥有folder_id
belongs_to :folder, #required: true
在rails 5 belongs_to something
中的意味着validates_presence_of :something_id
所以这里要么你应该在隐藏字段内传递folder_id
表单
或者如果您在创建文档时不需要folder_id
,那么请在模型optional: true
中设置
belongs_to :folder, optional: true