ネストされたルーティング+浅い編集は動作しません

私はこのようなルーティングを使いたいと思います:

resources :customers do
  resources :electricity_counters, :shallow => true do
    resources :electricity_bills, :shallow => true
  end
end

electricity_counterを作成するとうまくいきますが、編集が期待通りに機能しません。 私がelectricity_counters/1/editを訪れると空白のフィールドしか得られず、すべてのデータが失われてしまいます。

私の_form.html.erbはこのように始まります

<%= form_for([@customer, @customer.electricity_counters.build]) do |f| %>

新規および編集用のコントローラーメソッドは次のようになります。

# GET customers/1/electricity_counters/new
  def new
    @customer = Customer.find(params[:customer_id])
    @electricity_counter = @customer.electricity_counters.build
  end

  # GET /electricity_counters/1/edit
  def edit
    @electricity_counter = ElectricityCounter.find(params[:id])
    @customer = @electricity_counter.customer
  end

デバッグでは、私の@customer変数は正しく設定されていないようですが、おそらく私はそのaptanaデバッガを使うのは馬鹿です。

electricity_counterモデルには、以下のように設定された顧客との関連付けがあります。

belongs_to :customer

だから私は何が間違っているの?

5

1 答え

あなたの問題はこの行です。

<%= 形_for([@customer, @customer.electricity_counters.build]) do |f| %>

これは、あなたが何をしたいのかにかかわらず、新しい electricity_counter を構築します。コントローラーでそれを処理しているからです。

しかし、新しい _形 部分を同じに使いたい場合は、フォームパスを変更できる必要があります。基本的に私はこのようなことをした:

コントローラ

def new
  @customer = Customer.find(params[:customer_id])
  @electricity_counter = @customer.electricity_counters.build
  @path = [@customer, @electricity_counter]
end

def edit
  @electricity_counter = ElectricityCounter.find(params[:id])
  @customer = @electricity_counter.customer
  @path = @electricity_counter
end

<%= 形_for(@path) do |f| %>

また、あなたの routes.rb はオフになっています

resources :customers, :shallow => true do
  resources :electricity_counters, :shallow => true do
    resources :electricity_bills
  end
end
16
追加された
あなたのリソースは customer electricity_counter_path の序文を書く必要はありません shallow です。しかし、私はあなたの routes.rb を後ろ向きにしていると思います。
追加された 著者 Azolo,
まだ form_for([@ customer、@electricity_counter])が必要です。申し訳ありませんが、私は何か重要なことを忘れているかもしれませんが、私は今それをもう一度見ることはできませんが、私は数時間後になります。
追加された 著者 Azolo,
申し訳ありませんが、私は何かが欠けていた。両方向に行くためにはフォームが必要です。コントローラーを少し変えてやったので、私のソリューションをアップデートします。
追加された 著者 Azolo,
ありがとう:)しかし、他のエラーがあるようです。私が編集を開くと、#<#Class:0x10cb659d8>:0x10cb61590>のために、 NoMethodError in Electricity_counters#定義されていないメソッドを編集する customer_electricity_counter_path '
追加された 著者 kannix,
うーん、routes.rbを修正し、私のform_forメソッド呼び出しを <%= form_for @electricity_counter do | f |に変更しました。それでは、新しいルートが壊れているようです:( No route matches {:format => nil、:controller => "electricity_counters"}
追加された 著者 kannix,
私はそれをあなたの答えに戻して、あなたの答えを待つつもりです:) <%= form_for([@ customer、@electricity_counter])do | f | %>
追加された 著者 kannix,
ニース、ありがとうございました:)レールを学び始めました。あなたは私を多く助けました!
追加された 著者 kannix,