簡體   English   中英

Rails:多態關聯和accepts_nested_attributes

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM