未定义的方法 - 提交表单后属性为 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 #&lt;Person:0x9bbe9c4&gt;。我也应该调整视图吗? 你能用你的人物模型和你的控制器得到的参数来编辑你的帖子吗? 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”

提交表单后,子表单值在接收端显示为 null

jsp 中用js提交表单并关闭本窗口的问题。

okhttppost表单请求参数为null过滤

表单以“null”提交,但提交后将成为对象

未捕获的类型错误:无法读取 null 的属性“提交”以进行条带支付