2015-12-14 121 views
0

我是紅寶石新手。
我正在使用匹配「:controller(/:action(/:id))」,:via => [:GET,:PUT]作爲路由系統。
我正在使用acts_as_votable創建投票系統。
當前我在文章#顯示頁面。我有兩個鏈接,一個是upvote,另一個是downvote
後我點擊給予好評,我想打帖子#給予好評動作,然後重定向到帖子#再次顯示(同一頁)頁面。
爲此,我需要傳遞參數:id(後)以upvote操作。

如果我在崗位#票使用如何通過link_to標籤傳遞參數?

@post = Post.find(params[:id]) 

,它拋出一個錯誤,因爲我們沒有通過:ID到PARAMS哈希值。
如何通過:ID(帖子)params散列,當我點擊upvote按鈕,以擺脫我得到的錯誤。

這裏是帖子#upvote操作碼。

def upvote 
    @post = Post.find(params[:id]) 
    @post.upvote_from User.find(session[:user_id]) 
    redirect_to(:controller => "posts", :action => "show", :id => @post.id)  
end 


這裏是帖子的鏈接標籤#顯示頁。

<%= link_to({:controller => "posts", :action => "upvote"}) do %>       
    <span>Like</span> 
    <span>(<%= @post.get_upvotes.size %>)</span>       
<% end %> 

請幫幫我。在此先感謝

+0

'localhost:3000/posts/1'其中'1'是您的':id' – RAJ

+0

請編輯您的問題以包含視圖代碼,您可以在其中調用'link_to'。 –

+0

如果你點擊'/ posts/vote/1',會發生什麼? –

回答

3

你已經在做正確的控制器,你只需要包括:ID中的link_to網址選項:

<%= link_to(:controller => "posts", :action => "up vote", :id => @post) do %> 
    <span>Like</span> 
    <span>(<%= @post.get_upvotes.size %>)</span> 
<% end %> 

注意:你不需要調用id上後,導軌會自動爲您解決這個問題。

更好的解決方案,就是爲你的Post對象使用資源路由。再加入給予好評/ downvote操作:

# in config/routes.rb 
resources :posts do 
    member do 
     match "upvote", :as => :upvote, :via => [:get, :put] 
    end 
end 

Rails會自動創建,你可以在你的意見

# in show html.erb 
<%= link_to(upvote_post_url(@post)) do %> 
    <span>Like</span> 
    <span>(<%= @post.get_upvotes.size %>)</span> 
<% end %> 

的優勢,這是簡單的代碼使用的網址助手,並有能力改變與有你的路由更新模板代碼。

Rails已經完成了所有如何製作和鏈接到網址的繁重工作,爲了加快水管欄的視圖和控制器的速度,你一定要閱讀官方指南http://guides.rubyonrails.org/routing.html,然後可能看起來令人望而生畏,但他們將很快成爲第二知識。

+0

感謝兄弟,您的解決方案正在工作 –

0

試圖通過打從你的機器以下本地主機URL:

localhost:3000/posts/upvote/1 # where 1 is your :id 

我建議你去通過Ruby on Rais Guides

+0

正如我已經提到,我正在使用match「:controller(/:action(/:id))」,:via => [:GET,:PUT]作爲路由系統,並且該鏈接應該觸及posts#upvote action。請幫我解決這些問題 –

2

像這樣的事情

編輯:

<%= link_to "Upvote", "#{Rails.root}/posts/upvote/#{@post.id}" %> 

傳入@ post.id會傳入對象的ID在params散列(作爲params [:id])。

+0

我使用匹配「:controller(/:action(/:id))」,:via => [:GET,:PUT]作爲路由系統。耙路後,它只顯示兩條路線。前綴動詞URI模式控制器#動作 root GET/users#login GET | POST /:controller(/:action(/:id))(.:format):controller#:action –

+0

嗯,我不確定確切的語法來引用路由,比如來自link_to的調用,但也許嘗試這樣:<%= link_to「upvote」,「posts /upvote/#{@post.id}」%>。讓我知道如果這有效,我會編輯我的答案,包括它。 –

+0

我帖子#upvote,我應該實際使用@post變量「@ post.upvote_from User.find(session [:user_id])」方法。我需要在點擊upvote按鈕後抓住帖子 –