2012-01-15 79 views
0

好吧,說實話,我沒有花太多時間尋找解決方案,但看到我的兒子如何讓我的注意力四處奔跑。無論哪種方式,我想問一個問題,看起來很簡單,但到目前爲止,我一直困擾着我。回報,沒有傳遞給控制器​​的參數:遠程link_to

所以爲了保持簡單可以說我有用戶(w/model)和Home控制器,Home是根路線。

在根目錄中,我希望能夠看到用戶使用ajax創建的所有帖子,以便使用帖子列表更新主頁上的部分內容。

用戶控制器我有一個高清叫userposts本在它

def userposts 
    @user = User.find_by_id(params[:id]) 
    @userposts = @user.posts.all(:order => "created_at DESC") 
    respond_to do |format| 
    format.js { @userposts} 
    end  
end 

在我看來,我有

<p id="aboutuser"> 
    <% if @user.about? %> 
    <%= " " + @user.id.to_s %> 
    <% else %> 
    User has not yet filled this out. 
    <% end %> 
</p> 
<h3 id="authpostlink"> 
    <%= link_to "List of all posts", user_userposts_path(@user.id), :id => @user.id, :remote => true %> 
</h3> 

我的錯誤是如下

開始GET「/ users/2/userposts 「用於127.0.0.1 at Sun Jan 15 13:36:23 -0600 2012 UserController#userposts as JS參數:{」user_id「=>」2「}用戶負載(0.1ms)SELECT」users「。* FROM 「用戶」 WHERE 「用戶」, 「ID」 是完成在1ms內

NoMethodError(未定義的方法posts' for nil:NilClass):
app/controllers/users_controller.rb:27:in
userposts'

渲染 /home/n0de/.rvm/gems 500內部 服務器錯誤NULL LIMIT 1 /ree-1.8.7-2011.03/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms)Rendered /home/n0de/.rvm/gems/ree-1.8 .7-2011.03 /寶石/ ActionPack的-3.1.0/LIB/action_dispatch /中間件/模板/救援/ _request_and_response.erb (0.8ms)呈現 /home/n0de/.rvm/gems/ree-1.8.7-2011.03/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/救援內diagnostics.erb /佈局(的3.2ms)

我意識到我沒有貼_show.js.erb文件調用操作以更新DIV,但根據錯誤信息似乎並不過程中已經得到了那麼遠。

+0

問題似乎在你的routse.rb中,你可以發佈嗎? – markijbema 2012-01-15 19:59:33

+0

是@ user' null嗎?你有沒有向用戶資源添加一個新的RESTful動作呢?另外,我認爲你應該將'@ user'傳遞給'user_userposts_path '如果您按照[路由文檔](http://edgeguides.rubyonrails.org/routing.html#adding-more-restful-actions)中所述的方法將它添加爲方法':on =>:member'。 – 2012-01-15 20:04:57

回答

1

假設你具備以下條件:

#/config/routes.rb 
resources :users do 
    resources: posts 
end 

你得到了一羣偉大的「_path」方法免費(從運行$ rake routes

# /app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :posts 
end 

# /app/models/post.rb 
class Post < ActiveRecord::Base 
    belongs_to :user 
end 

我會在你的路由文件中添加nested resource您的控制檯可以看到它們),並且可以訪問諸如/ users/123/posts之類的URL。此請求將轉到您的PostsController的索引方法,並自動在params散列中包含:user_id => 123。然後,您可以執行以下操作:

# In your view: 
<%= link_to "List of all posts", user_posts_path(@user), :remote => true %> 
<div id="posts"></div> 

# /app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    respond_to :js # allows for AJAX requests 

    def index 
    if params[:user_id].present? # Do this if using the nested resource 
     @user = User.find(params[:user_id]) 
     @posts = @user.posts.order('posts.created_at DESC') 
    else # Otherwise, treat it like a normal request 
     @posts = Post.all 
    end 
    respond_with @posts 
    end 
end 

因爲你的請求被遠程發送,你需要你的索引視圖的相應的「JS」版本(注意文件名下面,看看this Railscast for more explanation):

# /app/views/posts/index.js.erb 
$('#posts').html("<%= escape_javascript(render(@posts)) %>"); 

這會將帖子渲染到<div id="posts">標記中。 (你可能還需要在/ app/views/posts /中有一個「_post.html.erb」部分)。

但是,說了這麼多,你確定需要通過AJAX來做這件事嗎?您可以簡單地預先加載UsersController#show方法中的所有帖子,最初使用CSS隱藏列表,然後在該鏈接上添加一個jQuery toggle()方法。無論如何,希望這是有道理的並且有幫助。

+0

非常感謝你,這是我忽視的東西(我累了,並命名js文件「_userposts.js.erb」而不是「userposts.js.erb」,而我最終使用你的方法張貼得到這個工作我還回到我的舊代碼,看看它爲什麼沒有工作,並與文件名更改我的舊代碼是正確的。但無論如何,感謝您的幫助。 – n0denine 2012-01-15 22:17:36

相關問題