2010-03-05 43 views
9

我試圖從一個按鈕的操作在連接表內創建一條記錄。我會有一個事件模型,並希望跟蹤來自每個用戶的選定事件。Rails - 添加記錄從控制器加入表

我使用了HABTM關係,因爲我不需要任何額外的字段。

User.rb:

has_to_and_belongs_to_many :events 

Event.rb:

has_to_and_belongs_to_many :users 

Events_Users遷移:

[user_id, event_id, id=>false] 

我越來越粘在實際創建的記錄。早有人幫我在控制檯中添加中記載:

u = User.find(1) 
u.events << Event.find(1) 

現在我想執行的操作,只需點擊某個鏈接的結果......這是在正確的方向?

def add 
    @user = User.find(session[:user_id]) 
    @event = Event.find(params[:id]) 
    if @user.events.save(params[:user][:event]) 
    flash[:notice] = 'Event was saved.' 
    end 
end 

我應該添加一個@user.events.new的地方,如果這樣做,我把這些用戶和事件的PARAMS在哪裏?

回答

13

下面的代碼應該工作(假設你在對應的事件對象的ID名稱標識的參數傳遞):

def add 
    @user = User.find(session[:user_id]) 
    @event = Event.find(params[:id]) 
    @user.events << @event 
    flash[:notice] = 'Event was saved.' 
    end 

我在你的代碼中看到的問題是:

  1. 您正將一個散列傳遞給.save。保存應該只取一個布爾值,對應是否應該運行驗證,默認情況下爲true。但.create和.new可以接受值的散列值。 (.save將在.new之後使用)。

  2. 您可以通過params [:id]加載事件,但是您嘗試通過params [:user] [:event]創建一個事件。你想要做什麼?創建或加載? (我的例子假設爲負載)

  3. 當用戶點擊按鈕並提交表單而不是「單擊鏈接」時,會產生類似此效果的操作。此代碼可能容易受到跨網站請求僞造(某人可能欺騙某人點擊另一個運行此操作的網站上的鏈接)。如果正確實施,Rails表單會受到保護,因爲它們使用了僞造保護令牌請求。

  4. 很可能您希望在此操作後重定向用戶。在執行這樣的操作(而不是重定向)之後呈現頁面被認爲是不好的做法。

+0

你的意思@ user.events << @ event.name ??? – ChrisWesAllen 2010-03-05 23:15:02

+0

不。如果我正確理解你對問題的描述,那麼這段代碼就沒有意義。 – Gdeglin 2010-03-05 23:18:58

+0

感謝您的建議,我將「<%= link_to image_tag(」grid_heart.gif「,:border => 0),:controller =>'event',:action =>'add_event'%>」更改爲「< %= button_to「添加」,:控制器=>'事件',:動作=>「添加」%>「但我仍然有一個」未初始化常量EventController「的錯誤我把方法放在錯誤的控制器? – ChrisWesAllen 2010-03-05 23:29:03

3

你在控制檯中做了什麼,你需要在控制器中做什麼。

def add 
    @user = User.find(session[:user_id]) 
    @event = Event.find(params[:id]) 
    @user.events << @event 
    flash[:notice] = 'Event was saved.' 
end 

這裏要注意的一點是,< <運營商現有的記錄將導致該協會立即堅持。

看看the ActiveRecord documentation瞭解更多信息。

0

如果事項標識作爲PARAMS傳遞[:ID]和你在這個調用只添加一個事件,然後,你可以做你的控制器代碼如下:

User.find(session[:user_id]).events << Event.find(params[:id]) 
    flash[:notice] = 'Event was saved.' 

你不需要明確save保存現有模型實例的has_many關聯。

方案1

u = User.new(..) 
u.events << Event.first 
# Now you need to call `save` in order to save the user object 
# and the events association 
u.save 

方案2

u = User.first 
u.events << Event.first 
# Don't need to call `save` on `u` OR `u.events` 
+0

我仍然得到 未初始化的常量EventController 任何想法它可能來自哪裏? – ChrisWesAllen 2010-03-05 23:34:44

+0

您可以在Pastie(http://pastie.org/)上發佈您的控制器代碼並提供鏈接。 – 2010-03-05 23:39:44

+0

我可以,但這是我添加到event_controller的唯一方法。當我刪除add方法時,沒有任何錯誤,並且控制器的其餘部分是從腳手架生成的,因此它是非常基本的東西。目前的方法看起來像...... 高清加 \t \t @user = User.find(會話[:USER_ID]) \t \t @event = Event.find(PARAMS [:編號]) \t \t @user。活動<< @event \t \t flash [:notice] ='事件已保存。' \t結束 – ChrisWesAllen 2010-03-05 23:44:42