1

我有一个简单的 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

新声明的 URL 正确显示了动物 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
4

3 回答 3

1

首先,您还应该更新

claim has_one animal

成为

claim belongs_to: animal

, 因为你已经有了

animal has_many claims

由此看来,父母是动物,索赔是孩子,因此孩子索赔表单试图以某种方式访问​​父母动物的id。


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

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

索赔控制器.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

说明:一旦您在表单中单击提交,它将在params名为 .h 的哈希中发布所有数据:claim:foo :bar :animal_id将是您的三个表单字段的三个假设名称,包括您的 hidden animal_id

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

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

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

.new 方法创建一条记录,但实际上并不保存到表中。.save 可以。

或者,您可以使用 .create,而不是使用 .new 和 .save,它会在一个镜头中连续完成这两项操作。

希望我能很好地理解您的应用程序、问题和需求,从而满足您的需求。


我很好奇,

另外,你能澄清一下什么被排除在外吗?也就是说,排除表是什么样子的。目的是为了简单地防止某些动物被列出并“可索赔”吗?

您的应用程序有什么理由不能让 Animals 模型有一个:excluded名为动物不排除,导致重复)

于 2014-01-09T02:04:02.010 回答
0

是否有任何类型的 before_filter 或任何可以从 URL 中获取传递的参数并临时为新表单视图创建关系,然后在提交表单后永久创建关系的东西?

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

Ruby on Rails。如何在 :belongs to 关系中使用 Active Record .build 方法?

在 Rails 3 中构建与新建

如果它没有帮助你可以在这里发布你是如何实现模型关联的?

于 2012-11-24T10:58:25.127 回答
0

随着关系更新:

animal has_one exclusion
exclusion has_one animal 

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

指定与另一个类的一对一关联。仅当其他类包含外键时才应使用此方法。

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

于 2012-11-24T11:22:50.167 回答