2011-11-12 30 views
0

我有Bands和Codes和Users。Rails 3 has_many,如何從索引動作創建對象及其關係

鍵/代碼會讓用戶用樂隊做事情。我在Band#show動作中,需要生成一個代碼,然後讓該代碼與用戶和樂隊相關。

這樣:

代碼belongs_to的:樂隊,belongs_to的:用戶 樂隊的has_many:代碼 用戶的has_many:代碼

所以現在我需要使用的form_for(我認爲),以創建一個按鈕,當壓執行以下操作:

檢查如果用戶具有與該帶中的碼(用戶可以有每個頻帶一個代碼)

如果不是:

  • 創建一個6位字母數字鍵/碼(我知道的ActiveSupport能做 它:<%= SecureRandom.hex(3)%>但是這需要在模型或 控制器)
  • 設置正確的關聯,這個代碼適用於這個用戶和這個樂隊。我使用的設計,所以我有機會獲得一個CURRENT_USER方法
  • ,並返回到頻帶#顯示 行動

如果用戶已經擁有該頻段代碼,那麼他們將得到一個錯誤「你已經有一個代碼「

我想最終使用Ajax進行調用,以防止重新加載頁面,但現在我只是試圖構建函數。

+1

查看關聯的RoR文檔http://guides.rubyonrails.org/association_basics.html – marimaf

+0

我已經這樣做了。雖然它有幫助,而且我能夠基於它建立我的模型,但我正在爲接下來的步驟而苦苦掙扎。即使有些方向會很酷,我應該尋找什麼類型的東西? –

回答

0

首先,我會在您的路線中創建以下路線。RB:

resources :bands do 
    post :add_code, :on => :member 
end 

這將創建一個額外的路徑看起來像這樣:

add_code_band_path POST /bands/:id/add_code(.:format) {:action=>"add_code", :controller=>"bands"} 
從你的觀點

然後你可以使用button_to輔助方法來發送POST請求是這樣的:

<%= button_to "Add Code", add_code_band_path(@band), :method => :post %> 

當用戶點擊該按鈕時,您可以像下面這樣通過控制器操作來處理其餘部分:

class BandsController < ApplicationController 
    ... 

    def add_code 
    @band = Band.find(params[:id]) 
    @code = current_user.codes.find_or_create_by_band_id(@band.id) 
    render :action => :show 
    end 

最後,實際的隨機代碼,我會從代碼模型本身before_create回調產生,就像這樣:

class Code < ActiveRecord::Base 
    ... 

    before_create :generate_code 

private 
    def generate_code 
    self.code = SecureRandom.hex(3) 
    end 
end 

然後,如果你認爲這是必要的,那麼你還可以添加其他覈實像只顯示添加代碼按鈕,如果沒有代碼存在或者可能添加錯誤消息,如果用戶試圖爲同一波段添加另一個代碼,但我將其留給您。 button_to幫助程序還通過使用:remote => true來支持Ajax,因此您可以按照自己的方式進一步開發它。

+0

丹恩,這是一個巨大的幫助。我很努力地看到如何做到這一點,這就是它。我能看到的唯一問題是它似乎沒有創建代碼。我是否需要在控制器的show動作中添加@code = Code.new? –

+0

對不起,我對find_or_create_by進行了更多的挖掘,我想也許我沒有足夠的理解它。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html有關將更多方法傳遞給它的問題... –

+0

我能夠通過稍微修改來解決我的問題:find_or_create_by_band_id(@ band.id,:user_id = > current_user.id) –

0

嘗試在你的樂隊/用戶代碼,的has_many:通過

你必須創建一個連接表,並加入模型,但我認爲這是你在找什麼。

相關問題