2011-10-29 60 views
0

我有傳遞參數的問題。在放映視圖我有無法通過link_to傳遞參數(導軌)

=的link_to 「發送消息」,{:控制器=> 「用戶」,:動作=> 「send_message」:USER_ID => @ user.id}

和我users_controller有方法

def send_message 
    @user = User.find(params[:user_id]) 
    @message=Message.new 
    redirect_to send_message_path 
end 

和我的表演方法

def show 
    @user = User.find(params[:id]) 
    @post=Post.new 
    @[email protected](:page => params[:page],:per_page => 10) 
    end 

但我有在該行點擊鏈接

沒有ID找不到用戶

,在send_message方法

@user = User.find(params[:user_id]) 

我在做什麼錯後錯誤?我讀到這個有很多的例子,但它不工作(

在此先感謝!

+0

顯示你的路由 – fl00r

回答

1
=link_to "Send message", [:send_message, @user] 

,並在你的路由:

resources :users do 
    post :send_message, :on => :collection 
end 
1

會發生什麼,如果你試圖改變:USER_ID到:ID,這樣

=link_to "Send message", {:controller => "users", :action => "send_message", :id => @user.id} 

def send_message 
    @user = User.find(params[:id]) 
    @message=Message.new 
    redirect_to send_message_path 
end 

如果的作品,那是因爲你的路線沒有設置爲使用:USER_ID PARAM如果沒有這將有助於更多地瞭解你的路線

+0

我有同樣的錯誤使用時:ID
我的路線是匹配「/ send_message」:以=>「用戶#send_message」 – Pavel

+0

唉唉它工作時,我改變了我的路線匹配「/用戶/: id/send_message',:to =>'users#send_message',:as =>'send_message'。感謝您試圖幫助我! – Pavel

+1

如果你希望它的工作方式與你已有的方式類似,你應該能夠改變你的路線來匹配'users /:id/send_message',:to =>'users#send_message''。如果你想改變一個更優雅的解決方案,請參閱fl00r的示例。 – nheinrich

0

在你的路線,你應該寫:

resources :users do 
    post :send_message, :on => :member 
end 

而且在你看來,你寫:

= link_to "Send Message", send_message_user_path(@user) 

這將使用id代替user_id。 所以在你的控制器中,你也需要使用params[:id]

Imho這比@ fl00r解決方案更清潔,因爲它是成員方法,而不是集合。

但我有點困惑,爲什麼你會在控制器裏面有那種方法。 因爲它唯一做的事情就是重定向到send_message_path。您設置的實例變量全部丟失。因此,在代替你的看法寫:

= link_to 'Send message', send_message_path(:user_id => @user.id) 

這會把你送到正確的控制器直道(在那裏你將不得不檢索用戶)。

另外您的show方法可以使用一些工作:您應該在User模型中定義一個has_many :posts