【发布时间】: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) SELECTusers.* 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)上。