【问题标题】:rails has_many through undefined method `body' forrails has_many 通过未定义的方法 `body' for
【发布时间】:2014-07-19 00:54:00
【问题描述】:

我有模型

class Riskfactor < ActiveRecord::Base
  has_many :bodies_riskfactors
  has_many :bodies, through: :bodies_riskfactors    
end

class Body < ActiveRecord::Base
  has_many :bodies_riskfactors
  has_many :riskfactors, through: :bodies_riskfactors   
end

class DisordersArticle < ActiveRecord::Base
  belongs_to :disorder
  belongs_to :article   
end

在视图中

= form_for [:admin, @riskfactor], html: {role: "form"} do |f|
  = f.select :body_ids, Body.all.collect {|x| [x.name, x.id]}, {}, :multiple => true

我更新有错误

可能出了什么问题?

Processing by Admin::RiskfactorsController#update as HTML

参数:{"utf8"=>"✓", "authenticity_token"=>"CVkdBHLzLAeQ8FRFBVyonUuyn1FZAYG+X9fX/mmj+Bo=", "riskfactor"=>{"body_ids"=>["", "1"] , "position"=>"1", "slug"=>"risk-factor-2", "name_ru"=>"高血压", "published_ru"=>"no", "content_ru"=>"" , "meta_description_ru"=>"", "meta_keywords_ru"=>"", "name_en"=>"高血压", "published_en"=>"no", "content_en"=>"

高血压高血压高血压高血压高血压

“,”meta_description_en“=>”,“meta_keywords_en”=>“”}“,按钮”=>“ ", "id"=>"4"} 用户负载 (0.3ms) SELECT users.* FROM users WHERE users.id = 1 ORDER BY users.id ASC LIMIT 1 风险因素负载 (0.3ms) SELECT riskfactors.* FROM riskfactors WHERE riskfactors.id = 4 LIMIT 1 (0.1ms) 开始 身体负荷 (0.3ms) SELECT bodies.* FROM bodies WHERE bodies.id = 1 ORDER BY position LIMIT 1 身体负载 (2.6ms) SELECT bodies.* FROM bodies INNER JOIN bodies_riskfactors ON bodies.id = bodies_riskfactors.body_id WHERE bodies_riskfactors.riskfactor_id = 位置 B Riskfactor::Translation Load (0.3ms) SELECT riskfactor_translations.* FROM riskfactor_translations WHERE riskfactor_translations.riskfactor_id = 4 存在风险因子 (0.6ms) 从riskfactors 中选择 1 作为一个 (riskfactors.slug = 'risk-factor-2' AND riskfactors.id != 4) 限制 1 (0.2ms) 回滚 在 15 毫秒内完成了 500 个内部服务器错误

NoMethodError (未定义的方法body' for #<Riskfactor:0x007f9a0351c350>): app/controllers/admin/riskfactors_controller.rb:45:inblock in update' app/controllers/admin/riskfactors_controller.rb:44:in `update'

风险因素控制器

class Admin::RiskfactorsController < Admin::BaseController
  before_action :set_riskfactor, only: [:show, :edit, :update, :destroy]

  def update
    respond_to do |format|
      if @riskfactor.update(riskfactor_params)
        format.html { redirect_to [:edit, :admin, @riskfactor], notice: 'Riskfactor was successfully updated.' }
        format.json { head :no_content }
       else
         format.html { render action: 'edit' }
         format.json { render json: @riskfactor.errors, status: :unprocessable_entity }
       end
     end
  end


  private
    def set_riskfactor
      @riskfactor = Riskfactor.find(params[:id])
    end

    def riskfactor_params
      params.require(:riskfactor).permit!
    end
end

【问题讨论】:

  • 也发布错误信息。
  • 也发布 riskfasctors_controller.rb,至少是更新部分。
  • Risfactor 是否有一个名为 body 的字段?这就是错误消息的含义。
  • 您使用的是has_many ... through 关系,因此外键位于through 表(bodies_riskfactors)上。

标签: ruby-on-rails has-many


【解决方案1】:

恕我直言,问题是您的视图中有body_ids,但您将关联命名为bodies。尝试将 body_ids 重命名为 bodies_ids 或类似名称。

【讨论】:

  • #<0x007f9a023971c0>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2013-09-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多