未定义的方法 - 提交表单后属性为 NULL (Rails 3.2.13)
Posted
技术标签:
【中文标题】未定义的方法 - 提交表单后属性为 NULL (Rails 3.2.13)【英文标题】:Undefined method - attribute is NULL after submitting form (Rails 3.2.13) 【发布时间】:2017-10-16 14:24:08 【问题描述】:错误:
undefined method 'function_id' for #<Person:0xa004934>
有一个试验管理系统。到目前为止,用户已经能够创建新的参与者。现在用户也应该能够创建新的人了。该人也将成为试验的参与者。
我们有一个表格来创建一个新人。在表单中点击create person
后,只有person表记录是OK的。但是participant
表中的function_id 属性是NULL。当用户创建一个人时,只需要在participant
表中设置值 function_id 是什么?因此,当创建一个新人时,应该始终创建一个参与者。
有 4 个表格:
试用has_many :participants
参与者belongs_to
人
人has_many participants
...has_many
:试验,通过:参与者
函数has_many
参与者
目前有效:
使用/views/participants/new.html.erb
表单创建一个新参与者 (id | trial_id | function_id | person_id) 有效。使用/views/persons/new.html.erb
形式创建一个新人(id | title | prename | surname 等)不像上面提到的那样 100% 有效。
在persons/new.html.erb
形式中,用户应该能够在下拉框中选择一个选项,该选项是participant
的功能。
我不想要一个全新的participant
记录。我只想要 function_id 值。
下面是/persons/views/new.html.erb
的sn-p
<%= form_for([@trial, @person]) do |f| %>
<div class="table">
<fieldset>
<div class="table">
<div class="tr">
<div class="th">
<%= f.label t(:function) %>
</div>
<div class="tdsep">:</div>
<div class="td">
<%= f.select :function_id, Function.all.collect |fu| [fu.german, fu.id] %>
</div>
</div>
...
编辑
人物模型
class Person < ActiveRecord::Base
belongs_to :organization
attr_accessible :organization_id,:title,:prename,:surname,:street,:street_number,:zip_code,:city,:phone,:fax,:email,:organization_description, :participants_attributes
has_many :participants
has_many :trials, through: :participants
人员控制器
class PersonsController < ApplicationController
load_and_authorize_resource :person, :through => :trial, :only => [:destroy]
before_filter :authenticate_user!, :except => [:index, :new, :create, :show]
load_and_authorize_resource :trial
def new
@person = Person.new
respond_to do |format|
format.html # new.html.erb
format.json render json: @person
end
end
def create
@person = Person.new(params[:person])
@person.trials << @trial
respond_to do |format|
if @person.save
format.html redirect_to @person, notice: 'Person was successfully created.'
format.json render json: @person, status: :created, location: @person
else
format.html render action: "new"
format.json render json: @person.errors, status: :unprocessable_entity
end
end
end
提前致谢。
【问题讨论】:
【参考方案1】:您必须将belongs_to :function
添加到您的人物模型中。
【讨论】:
这并不能解决问题。还有undefined method function_id' for #<Person:0x9bbe9c4>
。我也应该调整视图吗?
你能用你的人物模型和你的控制器得到的参数来编辑你的帖子吗?
将belongs_to :function
添加到人物模型,将function_id
添加到attr_accessible
如果我这样做了,We're sorry, but something went wrong.
就会出现。 function_id
是参与者表的一部分。编辑:在控制器中有错字。但是还是会出现上面的错误。【参考方案2】:
您无法在个人新视图中添加function_id
,因为个人数据库中没有任何function_id
。
所以解决方案是使用select_tag
而不是f.select
。
<%= select_tag :function_id, options_from_collection_for_select(Function.all.collect |fu| [fu.german, fu.id]) %>
更多信息请见here
【讨论】:
我做到了。现在出现错误ArgumentError in Persons#new - wrong number of arguments (1 for 3)
。我只是在阅读您推荐的来源。但是其他 2 个参数是什么?
你的 rails 版本是多少?
我的rails版本是3.2.13
试试select_tag('function_id', options_from_collection_for_select(Function.all.collect |fu| [fu.german, fu.id], )
现在有wrong number of arguments (2 for 3)
.^^ 我认为还缺少一个结束括号。我添加了它,所以它是,))
以上是关于未定义的方法 - 提交表单后属性为 NULL (Rails 3.2.13)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 React with Jest 和 Enzyme 中测试表单提交?无法读取未定义的属性“preventDefault”