【问题标题】:Get parent attribute within new child form?在新的子表单中获取父属性?
【发布时间】:2012-11-12 11:32:23
【问题描述】:

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

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

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

目前,我将 animal_id 传递给新的索赔表单,并将其插入到标记为 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

【问题讨论】:

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


    【解决方案1】:

    首先,你也应该更新

    claim has_one animal
    

    成为

    claim belongs_to: animal
    

    ,因为你已经有了

    animal has_many claims
    

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


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

    所以当你按下提交按钮时,它会将表单的所有值,包括animal_id值,传递给claims_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
    

    说明: 一旦您在表单中单击提交,它将在名为:claimparams 散列中发布所有数据。 :foo :bar :animal_id 将是您的三个表单字段的三个假设名称,包括您隐藏的 animal_id

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

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

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

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

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

    希望我能充分理解您的应用、问题和需求,从而满足您的需求。


    我很好奇,

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

    您的应用程序有什么原因不能让 Animals 模型有一个名为 :excluded 的列,并针对重复进行验证(重点是您没有排除动物的一行并且同一动物的第二行没有排除,导致重复)

    【讨论】:

      【解决方案2】:

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

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

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

      Build vs new in Rails 3

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

      【讨论】:

      • 构建似乎是为了在关联之前向父级添加值,我需要在关联之前从父级检索值。
      • 我相信那是糟糕的架构。如果您想从未保存的对象中获取 id 值……那是完全不可能的。我不确定你想用它实现什么。对我来说,这听起来有点像复合模式。
      • 基本上,动物具有排除条件。我想从新的索赔表视图中隐藏那些排除的条件。因此,用户不能就已被排除的内容提出索赔。
      【解决方案3】:

      关系更新:

      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 通过某事

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多