好吧老实说,我没有花太多时间寻找解决方案,但看到我的儿子如何保持我的注意力。无论哪种方式,我想问一个看似非常简单的问题,但到目前为止已经让我感到难过。
因此,为了保持简单,我说有用户(带模型)和家庭控制器,Home是根路由。
在根目录中,我希望能够查看用户使用ajax发布的所有帖子,以使用帖子列表更新主页上的部分内容。
在用户控制器中,我有一个名为 userposts 的def
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>
我的错误如下
在Sun Jan 15 13:36:23开始获取127.0.0.1的GET“/ users / 2 / userposts” -0600 2012由UsersController处理#userposts作为JS参数:{“user_id”=&gt;“2”}用户负载(0.1ms)SELECT“users”。* FROM“users”WHERE“users”。“id”IS NULL LIMIT 1 Completed 500 Internal 服务器错误1ms
NoMethodError(未定义的方法
posts' for nil:NilClass):
userposts'
app/controllers/users_controller.rb:27:in渲染 /home/n0de/.rvm/gems/ree-1.8.7-2011.03/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms)呈现 /home/n0de/.rvm/gems/ree-1.8.7-2011.03/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_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)
我确实发现我没有发布调用动作来更新div的_show.js.erb
文件,但是根据错误消息,这个过程看起来并没有那么远。
答案 0 :(得分:1)
假设你有以下内容:
# /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:
#/config/routes.rb
resources :users do
resources: posts
end
您可以免费获得一系列优秀的“_path”方法(从您的控制台运行$ rake routes
以查看所有这些方法),并且您可以访问/ users / 123 / posts等网址。此请求将转到PostsController的索引方法,并自动包含:user_id =&gt;参数哈希中的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()方法。无论如何,希望这是有道理的,也是有帮助的。