RoR,params没有被传递给控制器​​:remote link_to

时间:2012-01-15 19:54:35

标签: ruby-on-rails ruby ajax

好吧老实说,我没有花太多时间寻找解决方案,但看到我的儿子如何保持我的注意力。无论哪种方式,我想问一个看似非常简单的问题,但到目前为止已经让我感到难过。

因此,为了保持简单,我说有用户(带模型)和家庭控制器,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):
app/controllers/users_controller.rb:27:in
userposts'

     

渲染   /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文件,但是根据错误消息,这个过程看起来并没有那么远。

1 个答案:

答案 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()方法。无论如何,希望这是有道理的,也是有帮助的。