3

这是我一起试图让Carrierwave从观看Railscast开始工作。我有一个Post Project页面,用户可以在其中输入项目的详细信息。他们也可以上传文件到这个页面,并提交项目。所以我在页面上使用了nested_form_for。RoR:Carrierwave无法正常工作/保存到数据库

new_step_3.html.erb

<%= nested_form_for @project, :html => {:multipart => true} do |f| %> 
    <%= f.text_field :title %> 
    <%= f.text_field :description %> 

    <%= f.fields_for :document do |attachment_form| %> 
     <%= attachment_form.file_field :title %> 
    <% end %> 

    <%= f.text_field :skills %> 
    <%= f.submit 'Post Project' %> 
<% end %> 

project.rb模型

attr_accessible :category, :title, :budget, :end_date, :description, :skills, :document, :days_lasting, :documents_attributes 

belongs_to :user 
has_many :posts 
has_many :documents, :as => :attachable 

validates_presence_of :category, :title, :description, :skills 

accepts_nested_attributes_for :documents 

document.rb模型

attr_accessible :project_id, :title, :document 

belongs_to :user 
belongs_to :project 
has_many :posts 

mount_uploader :document, DocumentUploader 

projects_controller.rb

def create 
@project = current_user.projects.build(params[:project]) 

respond_to do |format| 
    if @project.save 
    format.html { redirect_to project_step_4_path(:start => @project.id), notice: 'Project was successfully created.' } 
    format.json { render json: @project, status: :created, location: @project } 
    else 
    format.html { render action: "new" } 
    format.json { render json: @project.errors, status: :unprocessable_entity } 
    end 
end 

现在,当我尝试提交表单,它会说未知属性:文件 应用程序/控制器/ projects_controller.rb:85:在'创造”

运行Rails中的命令控制台进行Document.create!(:文件=> File.new( “test.jpg放在”))

+0

请问您的底层数据库架构必须在“文件”表中的VARCHAR“文件”列? – clyfe 2011-12-19 23:02:55

+0

它确实,因为他说它在控制台中工作正常;) – Robin 2011-12-19 23:07:33

回答

2

我觉得应该是

<%= f.fields_for :documents do |attachment_form| %> 
    <%= attachment_form.file_field :title %> 
<% end %> 

与fields_for:文件

这就是为什么它找不到document属性。您的表单可能会发送像这样的散列:

{ 
    :project => { 
    :title => "blabla", 
    :document => {...} 
    } 
} 

并且它不知道如何处理文档。 现在,您的嵌套文档将位于:documents => {}中,并且与accepts_nested_attributes_for一起工作。

你必须build这个项目在控制器中的文件:

@project.documents.build 
+0

嘿罗宾,谢谢你的答案。当我现在做; file_field不显示在视图中。 – 2011-12-20 06:55:36

+0

我想这可能是因为你必须“建造”一个。所以在你的控制器中,执行'@project.documents.build'。 – Robin 2011-12-20 10:57:18

+0

谢谢罗宾。它把它固定了。 – 2011-12-20 20:51:15

相关问题