【问题标题】:How to create objects using rails polymorphic association如何使用rails多态关联创建对象
【发布时间】:2017-01-09 14:39:00
【问题描述】:

我想使用多态关联创建对象,但它返回如下错误:

NoMethodError (undefined method `new' for nil:NilClass):

这里是参数:

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"TAQdqSTXAFCrq6yZBUnjVXe7IsPqmxuLh/qM/2QvKaVvsfP
/Sy6VNF7H38IzOg8aMj39t6HR+aZLLtyj8uMzyw==", "search"=>"Newport-Mesa Unified 
School District", "id"=>"32", "type"=>"PrivateSchool", "commit"=>"Submit"}

这里是模型:

class PrivateSchool < ActiveRecord::Base
  has_many :popular_schools, as: :resource, :dependent => :destroy
end

class PopularSchool < ActiveRecord::Base
  belongs_to :resource, polymorphic: true
end

class School < ActiveRecord::Base
  has_many :popular_schools, as: :resource, :dependent => :destroy
end

控制器代码:

def index
    @popular_school = PopularSchool.new
    @popular_schools = PopularSchool.all
  end

  def create
    @popular_school.new.save
    respond_to do |format|
      format.html { redirect_to root_path }
      format.json { head :no_content }
      format.js
    end
  end

【问题讨论】:

  • @popular_school in nil in create 操作。相反,它应该是@popular_school = PopularSchool.new(params)
  • @Deep 我们需要重新定义参数吗?它是多态的,它应该自动工作,因为我没有提交其他参数。你能解释一下吗?
  • 您没有定义参数。 params 是您从视图接收的数据。因此,使用该数据您将创建一个新对象并将其保存在数据库中。您在index 操作中创建的@popular_school 不再在任何其他action 中可用,只能在视图中使用。
  • 即使在使用多态之后我们还需要在私有方法中再次定义参数?那我怎么修呢?我在参数中只有两件事。我只想将, "id"=&gt;"32", "type"=&gt;"PrivateSchool" 保存在数据库中。
  • 正在创建记录,但"id"=&gt;"32", "type"=&gt;"PrivateSchool" 未保存在数据库中。代码是:@popular_school = PopularSchool.new(name: params[:name]) @popular_school.save 可以吗?

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


【解决方案1】:

您尚未在任何地方定义@popular_school 变量。这就是您收到 NoMethodError (undefined method new for nil:NilClass): 错误的原因。

试试PopularSchool.create(your_params)

【讨论】:

  • 上面写着:ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
  • 你能告诉我们form从哪里提交以创建PopularSchool吗?
  • &lt;%= form_for([:admin, @popular_school]) do |f| %&gt; &lt;%= text_field_tag :search, "", id: "search-txt", class: "ui-autocomplete-input form-control" %&gt; &lt;div class="results" id="search-results"&gt;&lt;/div&gt; &lt;%= hidden_field_tag "id", "", value: "" %&gt; &lt;%= hidden_field_tag "type", "", value: "" %&gt; &lt;%= f.submit "Submit", :class =&gt; "btn btn-md btn-info" %&gt; &lt;% end %&gt;
  • 正在创建记录,但"id"=&gt;"32", "type"=&gt;"PrivateSchool" 未保存在数据库中。代码是:@popular_school = PopularSchool.new(name: params[:name]) @popular_school.save 可以吗?
  • 如果不重构表单,您可以尝试像这样@popular_school = PopularSchool.new(id: params[:id], type: params[:type]) 然后像@popular_school.save一样保存它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多