2016-11-30 1 views
0

要約:モデルの保存が失敗したときに、レールのネストされたリソースルートURLを保持する方法はありますか?

私はネストされた属性を持っています。私はルートに行く:アクションを作成するには

/customers/:id/credit_cards/new 

、失敗したセーブ、コードが

render :new 

を行います。これは、にURLをプッシュ:

/credit_cards/new 

どのように私は確信してURLの滞在を作るのですか顧客ルートとは?

詳細:

私は、次のルートを使用したい:

# Credit cards should be associated with a customer except 
# potentially on initial creation: 
resources :customers do 
    resources :credit_cards, only: [:index, :show, :new, :create, :edit, :update, :destroy, :show] 
end 
# Allow creating a credit card but selecting 
resources :credit_cards, only: [:new, :create] 

基本的には、顧客が存在するときのために、ネストされたルートと、私が作成して割り当てることができたときのための非ネストされたルート顧客と同じ視点で

私は新しいでは

app/controller/credit_cards_controller.rb 

で単一のコントローラを持っており、検証の失敗があった場合、私は顧客IDを持っているか、いない

before_action :set_credit_card, only: [:show, :edit, :update, :destroy] 
before_action :set_customer, only: [:index, :show, :create, :new, :edit, :update] 

# GET /credit_cards/new                                 
def new 
    @credit_card = if @customer 
        @customer.credit_cards.build rescue CreditCard.new 
       else 
        CreditCard.new 
       end 
end 

def create 
    @credit_card = CreditCard.new(credit_card_params) 
    respond_to do |format| 
    if @credit_card && @credit_card.save 
     format.html { redirect_to on_new_or_update_redirect_location, notice: 'Credit card was successfully created.' } 
    else 
     # HERE IS THE ISSUE: Figure out how to make sure the url stays as /customers/:id/credit_cards/new instead of /credit_cards/new                 
     format.html { render :new } 
    end 
    end 
end 

場合、私は、それをチェックするアクションを作成し、再ビューをレンダリングしますが、URLは

credit_cards/new 

にプッシュされています。正しいURLとcustomer_になっていません。 idはもはやパラメータではありません。私はcustomer_idを渡すことができれば正しいことをするだろうと思っていますが、どうやってそれを行うか分かりません。

答えて

1

これはおそらく、/customers/:id/credit_cardsではなく、/credit_cardsにあなたのフォームが投稿されているために発生している可能性があります。

このような何か見てフォームを変更し

:いずれの場合を処理する必要があり

<%= form_for [@customer, @credit_card] do -%> 
    ... etc... 
<%= end %> 

- @customerが定義されているかどうかを。得意先が定義されている場合はcustomer_credit_cards_path(@customer)に転記され、得意先が定義されていない場合はcredit_card_pathに転記されます。 createアクションには@customer変数を設定してください。このようにして、render :newは@customer変数でフォームをレンダリングします。

+0

ありがとうございました。それはそれだった。 –

関連する問題