回报,没有传递给控制器​​的参数:远程link_to

问题描述:

好吧,说实话,我没有花太多时间寻找解决方案,但看到我的儿子如何让我的注意力四处奔跑。无论哪种方式,我想问一个问题,看起来很简单,但到目前为止,我一直困扰着我。回报,没有传递给控制器​​的参数:远程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

假设你具备以下条件:

#/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