[英]Rails: Polymorphic assosiation and accepts_nested_attributes
附件將無法保存。 我在這里想念的是什么? 在我的應用程序中,我有一個項目,因為每個項目用戶都可以上傳許多資產。 上載是通過載波完成的。
這是模特
class Project < ActiveRecord::Base
has_many :assets,:as => :assetable,dependent: :destroy
accepts_nested_attributes_for :assets, :allow_destroy => true
end
class Asset < ActiveRecord::Base
belongs_to :project
belongs_to :user
belongs_to :assetable, :polymorphic => true
mount_uploader :attachment, AttachmentUploader #carrierwave
validates :attachment, presence: true
validates :project_id, presence: true
end
這些是我project_controller中的動作
def new
@project = Project.new
@asset = @project.assets.build
end
def create
@project = Project.new(project_params)
@project.assets.build
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render :show, status: :created, location: @project }
else
format.html { render :new }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
def project_params
params.require(:project).permit(:user_id, :summary, :start_date,assets_attributes: [:id, :project_id, :attachment,:user_id] )
end
這是表格的樣子
<%= form_for @project,:html => {:multipart => true } do |f| %>
<% if @project.errors.any? %>
<div id="error_explanation">
</div>
<% end %>
<%= f.fields_for :assets do |p| %>
<div class="field">
<%= p.label :attachment %><br>
<%= p.file_field :attachment,name: "assets[attachment][]" %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
schema.rb
create_table "assets", force: true do |t|
t.string "assetable_id"
t.string "assetable_type"
t.string "attachment"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "projects", force: true do |t|
t.string "user_id"
t.string "summary"
t.datetime "created_at"
t.datetime "updated_at"
end
projects / _form.html.erb
<%= form_for @project, :html => {:multipart => true } do |f| %>
<% if @project.errors.any? %>
<div id="error_explanation">
<%= @project.errors.inspect %>
</div>
<% end %>
<%= f.label :summary %>
<%= f.text_field :summary %>
<%= f.fields_for :assets do |p| %>
<div class="field">
<%= p.label :attachment %><br>
<%= p.file_field :attachment %>
<%= p.hidden_field :assetable_id %>
<%= p.hidden_field :assetable_type %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
projects_controller.rb
# GET /projects/new
def new
@project = Project.new
@project.assets.build
end
# POST /projects
# POST /projects.json
def create
@project = Project.new(project_params)
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render :show, status: :created, location: @project }
else
format.html { render :new }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def project_params
params.require(:project).permit(:user_id, :summary, :start_date, assets_attributes: [:id, :assetable_id, :assetable_type, :attachment, :user_id] )
end
project.rb
class Project < ActiveRecord::Base
has_many :assets, :as => :assetable, dependent: :destroy
accepts_nested_attributes_for :assets, :allow_destroy => true
end
asset.rb
class Asset < ActiveRecord::Base
belongs_to :project
belongs_to :assetable, :polymorphic => true
mount_uploader :attachment, AttachmentUploader #carrierwave
validates :attachment, presence: true
validates :assetable_type, presence: true
end
在旁邊
由於您是根據先前的問題提出這個問題的,所以我只想提一提:如果您打算資產類的實例屬於不同類型的類(即項目以外的東西),則只想使用多態關聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.