2015-07-21 17 views
3

創建一個單一的簡單的燒錄卡的應用程序有很多,屬於關係:集成用戶ID爲創建新對象在一個ActiveRecord數據庫

card belongs_to :user user has_many :cards

由於AR公約,建立了一套驗證爲USER_ID在卡表,以反映該協會:

create_table "cards", force: :cascade do |t| t.string "word_text", null: false t.string "meaning_text", null: false t.integer "user_id", null: false end

現在,創建一個新的燒錄卡運行功能測試,運行陷入困境,因爲我不「知道如何確保新創建的對象的user_id列獲取與user.id填寫...嘗試添加這對我的形式,但似乎沒有任何工作...

```

<%= form_for @card do |f| %> 
    <%= f.label :word_text %> 
    <%= f.text_field :word_text %> 

    <%= f.label :meaning_text %> 
    <%= f.text_field :meaning_text %> 

    <%= f.label :user_id %> 
    <%= f.number_field :user_id %> 

<%= f.submit "Create" %> 

```

我知道這是錯誤的,因爲當我在軌控制檯輸入@card.save!我得到這個錯誤:

ActiveRecord::RecordInvalid: Validation failed: User can't be blank

如果我登錄好了,應該自動使用用戶標識來創建新對象嗎?

非常新的鐵路,似乎無法破譯這裏發生了什麼。任何幫助將非常感激。謝謝!

+0

你做錯了。如果你正在爲關聯用戶創建卡,那麼在'user_id'中使用'hidden_​​field'或者在控制器中使用'params'將'user_id'追加。 – Pavan

+0

不要使用'hidden_​​field',這是最糟糕的主意,因爲它可以由最終用戶手動更改。這意味着我可以創建屬於他人的卡片。您應該在'create'操作中設置用戶的ID,並將其附加到收到的'params [:card]'。 – MrYoshiji

+0

感謝您的回覆。 Mr.Yoshiji,我相信我曾嘗試過這一點,在我的cards_controller的專用部分中添加card_params,使其看起來像這樣: ' def card_params params.require(:card).permit(:word_text,:意思_文本,:user_id user_id) 結束,但那是不正確的?我應該在創建方法本身附加? '@card = Card.new(params [:card])' – user3763074

回答

2

你可能有一個create行動像這樣在你的CardsController:

def create 
    card = Card.new(card_params) 
    if card.save 
    redirect_to some_path 
    else 
    redirect_to some_other_path 
    end 
end 

你應該追加用戶的id在創建行動,而不是問(既不增加hidden_field的建議),爲用戶的ID中形成。

def create 
    card = Card.new(card_params.merge(user_id: current_user.id)) 
    if card.save 
    redirect_to some_path 
    else 
    redirect_to some_other_path 
    end 
end 
+0

這個實現是成功的,謝謝 – user3763074

相關問題