【问题标题】:How do i work with nested model attributes in refinerycms?我如何在refinerycms 中使用嵌套模型属性?
【发布时间】:2013-09-04 10:14:07
【问题描述】:

我已经看到http://railscasts.com/episodes/196-nested-model-form-revised 并尝试对我的炼油厂引擎进行同样的操作,但是在从管理部分添加记录时我无法看到表单中的嵌套字段,而且我也没有收到任何错误。 我无法弄清楚到底发生了什么,或者如果我遗漏了任何与炼油厂相关的配置,可能会发生什么。

我在 Rails 控制台上试过这个:

 Refinery::Extension::Model.nested_attributes_options
 => {:nested_model_name=>{:allow_destroy=>false, :update_only=>false}}

我有 2 个模型问题和选项,但是在提交带有选项作为嵌套元素的问题表单时,它给了我如下错误

  ActiveModel::MassAssignmentSecurity::Error in  Refinery::Papers::Admin::QuestionsController#create

无法批量分配受保护的属性:refinery_papers_options

请求

参数:

{"utf8"=>"✓", "authenticity_token"=>"TqL+r60R05+meVhPBXPPipvL+X3ZNx+3dCwoThFBn/Y=", "问题"=>{"内容"=>"

aaaaaaaaaa

", "correct_answers"=>"a", "refinery_papers_options"=>{"content"=>"

asdfghjklkmnv

", "_destroy"=>"0"}, "position"=>0}, "locale"=>:en}

我的模型和视图是:

问题模型:

    module Refinery
     module Papers
     class Question < Refinery::Core::BaseModel

      self.table_name = 'refinery_papers_questions'

      attr_accessible :content, :correct_answers, :options_attributes, :position

      validates :content, :presence => true, :uniqueness => true

      has_many :options,
        :foreign_key => "refinery_papers_question_id",
        :class_name => "Refinery::Papers::Option",
        :dependent => :destroy

      accepts_nested_attributes_for :options,
        :allow_destroy => true

    end
  end
end 

Option Model:

    module Refinery
       module Papers
         class Option < Refinery::Core::BaseModel

           self.table_name = 'refinery_papers_options'

           attr_accessible :content, :position, :refinery_papers_question_id

           validates :content, :presence => true

           belongs_to :question,
            :class_name => 'Refinery::Papers::Question',
            :foreign_key => :refinery_papers_question_id

          end
        end
      end

在视图中嵌套字段的表单是这样的:

<%= f.fields_for :refinery_papers_options do |option_form| %>
   <div class='field'>
     <%= option_form.label :content, "Option" %><br/>
     <%= option_form.text_area :content, :class => "wymeditor widest" %><br/>
    </div>
   <div class='field'>
     <%= option_form.label :_destroy, "Remove Option" -%>
     <%= option_form.check_box :_destroy -%>    
   </div>
 <% end %>

当我在 Rails 控制台上尝试这个时,我得到了这个堆栈

2.0.0p247 :007 > Refinery::Papers::Question.create({"content"=>"

jhsdacnlkS

","correct_answers"=>"a", :refinery_papers_options => {"content"=>"

sjdfgczdj

"}}) ActiveModel::MassAssignmentSecurity::Error: 无法批量分配 受保护的属性:refinery_papers_options 来自 /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activemodel-3.2.14/lib/active_model/mass_assignment_security/sanitizer.rb:48:in process_removed_attributes' from /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activemodel-3.2.14/lib/active_model/mass_assignment_security/sanitizer.rb:20:in debug_protected_attribute_removal' 来自 /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activemodel-3.2.14/lib/active_model/mass_assignment_security/sanitizer.rb:12:in sanitize' from /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activemodel-3.2.14/lib/active_model/mass_assignment_security.rb:230:in sanitize_for_mass_assignment' 来自 /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activerecord-3.2.14/lib/active_record/attribute_assignment.rb:75:in assign_attributes' from /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activerecord-3.2.14/lib/active_record/base.rb:498:in initialize' 来自 /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activerecord-3.2.14/lib/active_record/persistence.rb:44:in new' from /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/activerecord-3.2.14/lib/active_record/persistence.rb:44:in create' 来自 (irb):7 来自 /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/railties-3.2.14/lib/rails/commands/console.rb:47:in start' from /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/railties-3.2.14/lib/rails/commands/console.rb:8:instart' 来自 /home/vivek/.rvm/gems/ruby-2.0.0-p247@refinery/gems/railties-3.2.14/lib/rails/commands.rb:41:in &lt;top (required)&gt;' from script/rails:6:inrequire' 来自 脚本/rails:6:in `'

【问题讨论】:

  • 你遇到了什么错误?
  • 我遇到了任何错误。它工作得和以前一样好,但看不到嵌套属性。
  • @RajarshiDas 嘿,现在我可以看到视图中的字段,但是在提交表单后,它给我的选项批量分配错误可以帮助解决这个问题。
  • 抱歉回复晚了.....如果您使用 rails 4 使用 strong_parameter 或者如果 rails 3.2 在您的模型中使用 attr_accessible :name #all fields 由另一个解决方案 config.active_record.whitelist_attributes = true 分配,请参阅链接whitelist
  • @RajarshiDas 感谢您的回复,我已经完成了您的建议,您可以检查我在上面发布的模型代码和视图代码,但我得到的不是批量分配问题。

标签: ruby ruby-on-rails-3.2 nested-attributes refinerycms model-associations


【解决方案1】:

可能是这个link 可以帮忙。

 has_many :parts,
         :foreign_key => :refinery_page_id,
         :class_name => '::Refinery::PagePart',
         :order => 'position ASC',
         :inverse_of => :page,
         :dependent => :destroy,
         :include => ((:translations) if ::Refinery::PagePart.respond_to?(:translation_class))

accepts_nested_attributes_for :parts, :allow_destroy => true

您在引擎中创建的不同模型的class names 可能存在混淆。以上代码只是refinery core 团队如何完成nested attributes concept 的一个示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多