1

簡単な Rails 3 アプリケーションがあり、その所有者に属する新しいレコードを作成しようとしています。子レコードの新しいフォームの非表示フィールドに id を渡すことで機能しています。

これはうまく機能し、新しい子フォームが送信されると、子/親の関係で正しく関連付けられます。

私がやろうとしているのは、新しい子フォーム内の親からのルックアップ値です。問題は、子関係がまだ作成されていないことです。ビューで .where ルックアップを使用できる方法はありますか? または、これを行うより良い方法はありますか?

現時点では、animal_id を新しい Claim フォームに渡していますが、animal_id というラベルの付いた隠しフィールドに挿入されています。

私がやろうとしていること:

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

上記は理想的には、すぐに関連付けられる動物から動物 ID を取得します。渡されたパラメーターを URL から取得し、一時的に新しいフォーム ビューの関係を作成し、フォームが送信されると関係を永続的に作成できるような before_filter などはありますか?

以下を 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

このことから、親が Animal であり、Claim が子であるように見えます。したがって、子クレーム フォームは何らかの形で親動物の ID にアクセスしようとしています。


ここまでであなたの状況が正しく理解できたなら、フォームに渡した animal_id 値にアクセスしてみませんか? その値は、claims_controller の新しいメソッドに既に渡されていますよね?

したがって、送信ボタンを押すと、フォームのすべての値 (animal_id 値を含む) が claim_controller の create メソッドに渡されます。

claim_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

説明: フォームで [送信] をクリックすると、 というparamsハッシュ内のすべてのデータが POST され:claimます。:foo :bar :animal_idhidden を含む 3 つのフォーム フィールドの 3 つの架空の名前になりますanimal_id

受け入れられた入力文字列をフォームから取得するプライベート メソッドを作成し、SQL インジェクションを防ぐために .require と .permit を実行します。

claim_params メソッドはClaim.new、新しい Claim オブジェクト (行、レコード) を作成できるように、メソッドに渡すために必要なパラメーターのハッシュを返します。

したがってclaim.new(claim_params)、フォーム入力からフィルタリングされた claim_params メソッドの戻り値を介して、animal_id を含むフォームから新しいクレームを作成します。

.new メソッドはレコードを作成しますが、実際にはテーブルに保存しません。保存します。

または、.new と .save を使用する代わりに、.create を使用できます。これは、両方を 1 回のショットで連続して実行します。

うまくいけば、私はあなたのアプリ、質問、そしてこれがあなたが必要とするものになるのに十分な必要性を理解しました.


私は興味がある、

また、除外されているものを明確にできますか? つまり、除外テーブルはどのように見えるかです。一部の動物がリストに掲載されて「請求可能」になるのを単に防ぐ目的ですか?

:excluded動物モデルに という名前の列を持たせ、重複に対して検証することができなかったアプリケーションには、どのような理由がありますか?動物は除外されず、重複する)

于 2014-01-09T02:04:02.010 に答える
0

関係の更新で:

animal has_one exclusion
exclusion has_one animal 

has_oneのドキュメントによる(http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one)

別のクラスとの1対1の関連付けを指定します。このメソッドは、他のクラスに外部キーが含まれている場合にのみ使用する必要があります。

そしてそれはどういうわけか、少なくとも一方の側が何かを通してbelongs_to定義またはhas_manyを持つべきであることを意味します

于 2012-11-24T11:22:50.167 に答える
0

渡されたパラメータをURLから取得し、新しいフォームビュー専用の関係を一時的に作成し、フォームが送信されたら永続的に関係を作成できる、ある種のbefore_filterなどはありますか?

あなたが探している「もの」はビルドだと思います。フィルタの前にその問題をうまく解決することはできません。

RubyonRails。:belongstoリレーションシップでActiveRecord .buildメソッドを使用するにはどうすればよいですか?

Rails3のビルドと新規

それが役に立たない場合は、ここにモデルの関連付けをどのように実装しましたか?

于 2012-11-24T10:58:25.127 に答える