2010-01-02 74 views
3

我有一個名字路線:的Ruby-on-軌道:通過PARAMS通過路由及的link_to

map.up_vote 'up_vote', :controller => 'rep', :action => 'up_vote 

up_vote需要兩個參數傳遞中,postIDposterID,我似乎無法圖如何做到這一點,但在集成測試中,我沒有任何問題。

部分:

link_to 'Up Vote', up_vote_path, {:postID => session[:user_post_id], :postersID => session[:poster_id]} 

集成測試:

post up_vote_path,{:postID => @latest.id,:postersID => users(:bob).id} (this works ok) 

1)什麼是對在部分回事?

2)我可以對我的測試做出什麼改變來解決這個問題?

回答

4

一問題:爲什麼你將鏈接中的會話變量傳遞給你?您可以直接從會議讓他們...

我不知道是否有任何特殊的理由把:user_post_id:在會話poster_id,但我建議你兩件事情:

1)傳遞的變量在URL中,會話可以(嘗試按後退,刷新,並在您的瀏覽器轉發)

2)使用中的資源的URL /控制器動作邏輯。

例(有效期只有當我得到它的權利,你投票的用戶的帖子):

路線:

map.resources :users do |user| 
    user.resources :posts do |post| 
    post.resource :vote 
    end 
end 

所以,你可以使用這個URL:

/users/:id/posts/:post_id/vote 

和鏈接路徑:

link_to "Up", user_post_vote_path(@user, @post), :method => :create 

我把@user,而是@Post整數的,因爲路徑方法接受他們,你可以建立一個更短的版本:

link_to "Up", [@user, @post, :vote] # or [:vote, @post, @user] 

實現:

class VoteController .... 
    def create 
    # do your stuff here 
    end 
end 

這樣它會更容易和RESTful 。

瑞安貝茨在資源上得到great episode,它肯定值得一看。

3

你想通過你的PARAMS在..._path

link_to "Up Vote", up_vote_path(:postID => session[:user_post_id], :postersID => session[:poster_id]) 

集成測試比的link_to不同的寫出來,因爲你的測試行爲。

「爲」 up_vote_path,「與這些」 {PARAMS}

而且因爲你做一個POST,你將要適當加:法選項將link_to