我有一个简单的Rails 3应用程序,我正在尝试创建一个属于它的所有者的新记录。它的工作原理是将id传递给子记录新形式的隐藏字段。
这很有效,一旦新的子表单提交,它就会在子/父关系中正确关联。
我要做的是,查找值是新子表单中的父级。问题是尚未创建子关系。无论如何我可以在视图中使用.where查找吗?或者,有更好的方法吗?
目前我将animal_id传递给新的Claim表单,并将其插入标记为animal_id的隐藏字段。
我想做什么:
<%= @animal.where(:animal_id => params[:animal_id]).id %>
上述理想情况下,可以从即将关联的动物中获取动物ID。是否存在任何类型的before_filter或任何可以从URL中获取传递的参数并暂时为新表单视图创建关系,然后在提交表单后永久创建关系的任何内容?
我尝试将以下内容添加到我的Claims控制器中,然后在视图中调用@animal.AnimalName
,但我得到NoMethodError:
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
答案 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?
如果它没有用,你可以在这里发帖,你是如何实现模型关联的?
答案 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通过某种东西