在新的子表单中获取父属性?

时间:2012-11-24 10:23:49

标签: ruby-on-rails-3 model associations relationship

我有一个简单的Rails 3应用程序,我正在尝试创建一个属于它的所有者的新记录。它的工作原理是将id传递给子记录新形式的隐藏字段。

这很有效,一旦新的子表单提交,它就会在子/父关系中正确关联。

我要做的是,查找值是新子表单中的父级。问题是尚未创建子关系。无论如何我可以在视图中使用.where查找吗?或者,有更好的方法吗?

目前我将animal_id传递给新的Claim表单,并将其插入标记为animal_id的隐藏字段。

我想做什么:

<%= @animal.where(:animal_id => params[:animal_id]).id %>

上述理想情况下,可以从即将关联的动物中获取动物ID。是否存在任何类型的before_filter或任何可以从URL中获取传递的参数并暂时为新表单视图创建关系,然后在提交表单后永久创建关系的任何内容?

我尝试将以下内容添加到我的Claims控制器中,然后在视图中调用@animal.AnimalName,但我得到NoM​​ethodError:

before_filter :find_animal

protected
def find_animal
 if params[:animal_id]
   Animal.find(params[:animal_id])
 end
end

新版权声明的网址正确显示动物ID,所以我不确定为什么它没有找到它:

http://localhost:3000/claims/new?animal_id=1

模型关系如下:

animal has_many claims
animal has_one exclusion

claim has_one animal

exclusion has_one animal

更新

我已将我的关系纠正如下:

animal has_one exclusion
exclusions belong_to animal

3 个答案:

答案 0 :(得分:1)

首先,您还应该更新

claim has_one animal

claim belongs_to: animal

,因为你已经有了

animal has_many claims

由此看来,父母似乎是动物,并且声明是孩子,因此儿童声明表单试图以某种方式访问​​父动物的身份。


如果到目前为止我正确理解了您的情况,为什么不只是访问传递给表单的animal_id值?您已经将该值传递给claim_controller中的新方法,对吗?

因此,当您按下提交按钮时,它会将表单的所有值(包括animal_id值)传递给claim_controller的create方法,

claims_controller.rb

    def create
      @claim = claim.new(claim_params)
      if @claim.save
        redirect_to claim_path(@claim)
  else
        render 'new'
  end
    end

private

def claim_params
  params.require(:claim).permit(:foo, :bar. :animal_id)

end

说明: 在表单中单击“提交”后,它将POST params哈希中名为:claim的所有数据。 :foo :bar :animal_id将是三个表单字段的三个假设名称,包括您隐藏的animal_id

我们创建一个私有方法从表单中获取接受的输入字符串,并执行.require和.permit以防止sql注入。

claim_params方法返回传递给Claim.new方法所需的参数哈希,以便您可以创建一个新的Claim对象(又名row,aka record)。

所以claim.new(claim_params)通过claim_params方法的返回值从表单创建一个新的声明,包括animal_id,该声明是从表单输入中过滤的。

.new方法创建一条记录,但实际上并没有保存到表中。 .save确实。

或者,不是使用.new和.save,而是使用.create,它可以一次性连续执行。

希望我理解您的应用,问题和需求,以便达到您的需求。


我很好奇,

另外,你能澄清一下被排除在外的东西吗?也就是说,排除表看起来像什么。 目的是简单地阻止某些动物被列入并“声称拥有?”

你的应用程序有什么理由让它不能让Animal模型有一个名为:excluded的列,并验证重复(要点是你没有一行动物像排除并排除同一动物的第二行,导致重复)

答案 1 :(得分:0)

  

是否有任何类型的before_filter或任何可以采取的   从URL传递params并临时创建关系   只为新的表单视图,然后永久创建   表格提交后的关系?

我认为你正在寻找的'东西'是构建。在过滤之前不能很好地解决这个问题。

Ruby on Rails. How do I use the Active Record .build method in a :belongs to relationship?

Build vs new in Rails 3

如果它没有用,你可以在这里发帖,你是如何实现模型关联的?

答案 2 :(得分:0)

关系更新:

animal has_one exclusion
exclusion has_one animal 

由于has_one(http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one)的文档而

  

指定与另一个类的一对一关联。这种方法   只应在其他类包含外键时使用。

并且以某种方式暗示至少一方应该在或上具有belongs_to定义 has_many通过某种东西