2016-11-30 32 views
0

摘要:模型保存失敗時如何保持軌道嵌套的資源路徑url?

我有一個嵌套的屬性。我去的路線:

/customers/:id/credit_cards/new 

在創建動作,保存失敗,代碼執行

render :new 

這推動網址:

/credit_cards/new 

如何確保網址保持與客戶路線?

詳情:

我想用以下途徑:

# 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 

當有一個驗證失敗,它重新呈現的觀點,但推動的網址到

credit_cards/new 

所以我不再在正確的URL和customer_ ID不再是一個參數。我假設如果我可以通過customer_id它會做正確的事情,但我還沒有找到如何做到這一點。

回答

1

這可能是因爲您的表單張貼到/credit_cards而不是/customers/:id/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

謝謝。就是這樣。 –