在多态关联中创建不起作用的操作

时间:2013-11-05 13:12:34

标签: ruby-on-rails polymorphic-associations null

我在create中的plannings_controller操作时遇到问题。

def new
  @plannable = find_plannable
  @planning = @plannable.plannings.build
  3.times { @planning.periods.build }

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @planning }
  end
end


def create
  @plannable = find_plannable
  @planning = @plannable.plannings.build(params[:planning])
  respond_to do |format|
    if @planning.save
      format.html { redirect_to @plannable }
      format.json { render json: @planning, status: :created, location: @plannable }
    else
      format.html { render action: "new" }
      format.json { render json: @planning.errors, status: :unprocessable_entity }
    end
  end
end


def find_plannable
  params.each do |name, value|
    if name =~ /(.+)_id$/
      return $1.classify.constantize.find(value)
    end
  end
  nil
end

#new操作中,find_plannable方法返回我想要的值,但在#create操作中它返回nil,我不知道为什么会发生这种情况。

我的模特就像瑞恩·贝茨(Ryan Bates)在钢轨演员的多态剧集中一样:

#PLANNING MODEL
class Planning < ActiveRecord::Base
  attr_accessible :subsubsystem_id, :subsystem_id, :system_id, :plannable_type, :plannable_id, :periods_attributes, :_destroy
  has_many :periods, :dependent => :destroy
  belongs_to :plannable, polymorphic: true
  accepts_nested_attributes_for :periods, :reject_if => lambda { |a| a[:planned_quantity].blank? }, :allow_destroy => true
end

#SUBSUBSYSTEM MODEL
class Subsubsystem < ActiveRecord::Base
  attr_accessible :hh, :name, :percentage, :price, :subsystem_id, :total_quantity, :unity, :value, :weight
  belongs_to :subsystem
  has_many :plannings, :as => :plannable
end

任何人都可以帮助我吗?!提前谢谢!

编辑:参数:

{"utf8"=>"✓",
 "authenticity_token"=>"vSr7C1+3+RhYArAmYz+zuAsLXsXriwouF771bn79+Is=",
 "planning"=>{"periods_attributes"=>{"0"=>{"planned_quantity"=>"11"},
 "1"=>{"planned_quantity"=>"6"},
 "2"=>{"planned_quantity"=>"8"}},
 "_destroy"=>"0"},
 "commit"=>"OK"}

2 个答案:

答案 0 :(得分:0)

你是否检查了你的参数似乎你在创造和新的情况下对params有不同的价值。你可以请求创建和新的params哈希,它可以帮助其他人解决你的问题

答案 1 :(得分:0)

在POST参数中,没有匹配/(.+)_id$/的字段,因此,您在find_plannable

内查找类的尝试将失败

简单的解决方法是,在#new中,在表单内添加plannable_id的隐藏字段。你已经有了@plannable,所以这很容易。

然后,您将获得plannable_id及其值find_plannable