rails 4嵌套表单不保存

时间:2013-12-24 17:30:23

标签: ruby-on-rails ruby nested-forms nested-attributes

我知道这里有很多关于此问题的未解决的问题,但没有一个对我有帮助。

我的主要模型正确保存,所有数据都在后期数据中,但它只是不保存嵌套模型!

谢谢堆。是否有关于允许的参数或attr_accessors的内容?我怀疑的东西..我真的没有找到任何文件...

这是我的代码:

products_controller.rb

def product_params
    params.require(:product).permit(:title, :description, :netprice, :vat, :price, :unit_count,         :unit, :category, :img, :origin, :originid, :producer, :stock, :discount, :stories_attributes, :origins_attributes, :id)
    end
end

def new
    @product = Product.new
    3.times { @product.stories.build }
    @product.origins.build
    @categories = []
    Category.all.each do |category|
    @categories.push([category.name, category.name])
    end

end

def create
    @product = Product.new(product_params)
    respond_to do |format|
    if @product.save
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render action: 'show', status: :created, location: @product }
    else
        format.html { render action: 'new' }
        format.json { render json: @product.errors, status: :unprocessable_entity }
    end
    end
end

origin.rb

class Origin < ActiveRecord::Base
belongs_to :product
end

product.rb

class Product < ActiveRecord::Base
    attr_accessor :stories_attributes, :origins_attributes
    has_many :stories
    has_many :origins
    accepts_nested_attributes_for :stories, allow_destroy:true, :reject_if => lambda { |a|     a[:text].blank?}
    accepts_nested_attributes_for :origins, allow_destroy:true, :reject_if => lambda {|a|      a[:city].blank?}

story.rb

class Story < ActiveRecord::Base
    belongs_to :product

end

表格的相关部分

  <section class="product-story-section">
  <%= f.fields_for :stories do |builder| %>
  <fieldset>
    <%= builder.label :yindex, "Y-Index" %><br>
    <%= builder.text_field :yindex %><br>
     <%= builder.label :description, "Story-Text" %><br>
    <%= builder.text_area :description %><br>
     <%= builder.label :img, "Bild-URL" %><br>
    <%= builder.text_field :img %><br>
    <%= builder.hidden_field :productid, value:"1" %><br>
  </fieldset>
<% end %>
</section>
<hr>
<%= f.fields_for :origins do |builder| %>
  <fieldset>
    <%= builder.label :city, "Stadt" %><br>
    <%= builder.text_field :city %><br>
    <%= builder.label :country, "Land" %><br>
    <%= builder.text_area :country %><br>
    <%= builder.label :geolat, "Geolocation Latitude" %><br>
    <%= builder.text_field :geolat %><br>
    <%= builder.label :geolng, "Geolocation Longitude" %><br>
    <%= builder.text_field :geolng %><br>
  </fieldset>
<% end %>


  Started POST "/products" for 127.0.0.1 at 2013-12-24 21:01:16 +0100
  Processing by ProductsController#create as HTML
  Parameters: {"utf8"=>"✓",    "authenticity_token"=>"90MXIlzOQg6AcTwwYOkfNsfPuSt1/9UHjqZwHVRnET4=", "product"=>    {"title"=>"9", "description"=>"9", "netprice"=>"9", "vat"=>"9", "price"=>"9",    "unit_count"=>"9", "unit"=>"9", "img"=>"", "originid"=>"99", "origin"=>"", "producer"=>"9",     "stock"=>"9", "discount"=>"9", "stories_attributes"=>{"0"=>{"yindex"=>"9", "description"=>"9",    "img"=>"9", "productid"=>"1"}, "1"=>{"yindex"=>"9", "description"=>"9", "img"=>"9",   "productid"=>"1"}, "2"=>{"yindex"=>"9", "description"=>"9", "img"=>"9", "productid"=>"1"}},  "origins_attributes"=>{"0"=>{"city"=>"9", "country"=>"", "geolat"=>"9", "geolng"=>"9"}}},  "commit"=>"Create Product"}
Unpermitted parameters: img, productid
Unpermitted parameters: img, productid
Unpermitted parameters: img, productid
(0.1ms)  BEGIN
  SQL (0.3ms)  INSERT INTO `products` (`created_at`, `description`, `discount`, `img`,    `netprice`, `origin`, `originid`, `price`, `producer`, `stock`, `title`, `unit`, `unit_count`, `updated_at`, `vat`) VALUES ('2013-12-24 20:01:16', '9', 9.0, '', 9.0, '', 99, 9.0, '9', 9, '9', '9', 9, '2013-12-24 20:01:16', 9.0)
   (0.5ms)  COMMIT
Redirected to http://localhost:3000/products/1
Completed 302 Found in 46ms (ActiveRecord: 0.9ms)

新错误消息

`attr_accessible` is extracted out of Rails into a gem. Please use new recommended protection      model for params(strong_parameters) or add `protected_attributes` to your Gemfile to use old one.

1 个答案:

答案 0 :(得分:1)

您的end方法中有额外的product_params。这应该会引起错误。

您还需要将storiesorigins属性添加到许可列表中:

def product_params
    params.require(:product).permit(:title, :description, :netprice, :vat, :price, :unit_count, :unit, :category, :img, :origin, :originid, :producer, :stock, :discount, stories_attributes: [:yindex, :description, :image], origins_attributes: [ :city, :country, :geolat], :id)
end

更新:将遗失的属性添加到stories_attributesorigins_attributes的许可列表中:

def product_params
    params.require(:product).permit(:title, :description, :netprice, :vat, :price, :unit_count, :unit, :category, :img, :origin, :originid, :producer, :stock, :discount, stories_attributes: [:yindex, :description, :img, :product_id], origins_attributes: [ :city, :country, :geolat, :geolng], :id)
end

第二次更新:

您还需要按如下方式更新产品型号:

class Product < ActiveRecord::Base
  attr_accessible :stories_attributes, :origins_attributes
  ...
end

attr_accessor替换为attr_accessibleattr_accessible应该用于允许属性进行质量分配。

在你的控制器的创建动作中:

# ProductsController
def create
    @product = Product.new(product_params)
    ...
end

您的product_params肯定包含stories_attributesorigins_attributes,并且会正确传递给Product.new方法,但由于他们的属性不允许进行批量分配,因此您看不到关联已创建storiesorigins。请注意,attr_accessor是一种Ruby方法,仅为属性定义getterssetters,但不允许进行批量分配。