【问题标题】:Nested attributes using paperclip rails 4使用回形针导轨的嵌套属性 4
【发布时间】:2014-06-16 16:31:26
【问题描述】:

我是 Rails 新手,我正在尝试使用嵌套属性。 主要思想是有一个交易(报价)模型,一个交易将有多个来自回形针的交易照片。 我已经看过 Ryan 的 Railscast 嵌套表单,并阅读了许多文章,其中包含许多关于同一问题的问题的提示,但它仍然对我不起作用。

这是我的实现:

    class Deal < ActiveRecord::Base
    belongs_to :user
    has_many :deal_photos, dependent: :destroy

    accepts_nested_attributes_for :deal_photos
    end


    class DealPhoto < ActiveRecord::Base
     belongs_to :deal
     has_attached_file :photo, :styles => { :large => "600x170", :medium => "250x250!",         :thumb => "100x100>" }, :default_url => lambda { |photo| photo.instance.set_default_url}

     def set_default_url
      ActionController::Base.helpers.asset_path('missing.png')
     end
    end

在我的交易控制器中:

    class DealsController < ApplicationController
     def new_deal
  @deal=Deal.new()
      @user= User.find(params[:id])
      3.times { @deal.deal_photos.build }
     end

    def create
     @deal = Deal.new(deal_param)
     @user= User.find(params[:user_id])
     if @deal.save
        @user.deals << @deal
        flash[:notice]="Thank you"
     end
    end

    def edit
     @deal=Deal.find(params[:deal_id])
     3.times { @deal.deal_photos.build }
    end

    def update
     @deal=Deal.find(params[:id])
     if @deal.update_attributes(deal_params)
      flash[:notice]="Deal updated successfully"
     end
    end

    private
    def deal_params
    params.require(:deal).permit(:title, :description, :contact_num, :user_id,    :deal_photos_attributes => [ :id, :caption, :photo, :deal_id])
    end

终于在我的新交易表格中:

    <%= form_for(:deal, :url=>{:action=>'create', :user_id=> @user.id}) do |f| %>

      <label>Title<b style="color:red;">*</b>
      <%= f.text_field(:title, :placeholder=>"") %>
      </label>

------------更多字段---------

      <%= f.fields_for :deal_photos do |builder| %>
        <div>
          <%= builder.label :caption, "Image Caption" %>
          <%= builder.text_field :caption %>

          <%= builder.label :photo, "Image File" %>
          <%= builder.file_field :photo %>
        </div>
      <%end%>

      <%= button_tag("Create", :class=> "secondary button", :button_type => "submit") %>

(我已经迁移了交易照片的数据库以接受回形针)

上面创建了一个包含所有字段的表单,但文件上传的 3 个输入仅显示一个。它会创建 3 个空关联 @deal.deal_photos 但即使我从表单中选择要上传的一张图片,它也不会保存它。 如果您有任何有用的建议或其他类似问题,请提供帮助!

【问题讨论】:

    标签: ruby-on-rails-4 paperclip nested-attributes activemodel


    【解决方案1】:

    您的deal_param 方法中有什么内容? 您是否允许其中包含 deal_photos 的属性? 如果没有,那么做类似的事情

    def deal_params
     params.require(:deal).permit(deal_attr1, deal_attr2,...., deal_photos_attributes: [:deal_photo_attr1, ...])
    end
    

    另外,您的deal_photos 视图中有deal_id 吗?

    【讨论】:

    • 感谢您的回复。我已经更新了问题,以便您可以看到交易参数。是的,我看到了 deal_id。
    • 我想您正在访问控制器中的 new_deal 操作。所以@deal 是一个新实例,而deal_photos 没有得到deal_id。对吗?
    • 据我所知,构建动作是新动作的别名。此实现创建了 3 个实例以及它们之间的关联,但它不会生成三个输入字段。只生成了一个字段,并没有上传我选择的图片。1
    【解决方案2】:

    最后,当我更换了以下内容时,我能够解决 new_deal.html.erb 中的问题:

        <%= form_for(:deal, :url=>{:action=>'create', :user_id=> @user.id}) do |f| %>
    

        <%= form_for(@deal, :url=>{:action=>'create', :user_id=> @user.id}) do |f| %>
    

    改变的是第二行是针对特定的新交易实例。正如Alexphys所说,也许第一个不起作用的原因是deal_photos没有得到deal_id。但是我仍然没有弄清楚确切的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多