回报,没有传递给控制器的参数:远程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):
userposts'
app/controllers/users_controller.rb:27:in渲染 /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,但根据错误信息似乎并不过程中已经得到了那么远。
假设你具备以下条件:
#/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()方法。无论如何,希望这是有道理的并且有帮助。
非常感谢你,这是我忽视的东西(我累了,并命名js文件“_userposts.js.erb”而不是“userposts.js.erb”,而我最终使用你的方法张贴得到这个工作我还回到我的旧代码,看看它为什么没有工作,并与文件名更改我的旧代码是正确的。但无论如何,感谢您的帮助。 – n0denine 2012-01-15 22:17:36
问题似乎在你的routse.rb中,你可以发布吗? – markijbema 2012-01-15 19:59:33
是@ 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