RoR, параметры не передаются в контроллер для: remote link_to - PullRequest
0 голосов
/ 15 января 2012

Ладно, если честно, я не тратил много времени на поиски решения, но видел, как мой сын заставляет меня бегать. В любом случае я хотел бы задать вопрос о чем-то, что кажется довольно простым, но до сих пор озадачило меня.

Итак, для простоты, скажем, у меня есть пользователи (с моделью) и контроллеры Home, Home является корневым маршрутом.

В корневом каталоге я хочу, чтобы я мог видеть все сообщения, сделанные Пользователем с помощью ajax, чтобы обновить частичное на главной странице со списком сообщений.

В контроллере users у меня есть def с именем 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 в воскресенье, 15 января 13:36:23 -0600 2012 Обработка UsersController # userposts как JS Параметры: {"user_id" => "2"} Загрузка пользователя (0,1 мс) ВЫБЕРИТЕ "пользователи". * ОТ "пользователей" ГДЕ "пользователи". "ИД" НУЛЕВ ЛИМИТ 1 Завершено 500 Внутренний Ошибка сервера в 1 мс

NoMethodError (неопределенный метод posts' for nil:NilClass):<br> 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,8 мс) отображается /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,8 мс) отображается /home/n0de/.rvm/gems/ree-1.8.7-2011.03/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb в пределах rescues / layout (3.2ms)

Я понимаю, что не публиковал файл _show.js.erb, который вызывает действие по обновлению div, но, согласно сообщениям об ошибках, процесс не зашел так далеко.

1 Ответ

1 голос
/ 16 января 2012

Если у вас есть следующее:

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

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

Я бы добавил вложенный ресурс в ваш файл маршрутов:

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

Вы получаете кучу отличных методов "_path" бесплатно (запустите $ rake routes из консоли, чтобы увидеть их все), и это даст вам доступ к URL-адресам, таким как / users / 123 / posts. Этот запрос перейдет к методу index вашего PostsController и автоматически включит: user_id => 123 в хэш params. Затем вы можете сделать следующее:

# 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" версия вашего представления индекса (запишите имя файла ниже и см. этот Railscast для более подробного объяснения ):

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

Это выведет сообщения в этот тег <div id="posts">. (Вам, вероятно, также понадобится частичный "_post.html.erb" в / app / views / posts / ".)

Однако, сказав все это, вы уверены, что вам нужно сделать это через AJAX? Вы можете просто предварительно загрузить все сообщения в методе UsersController # show, сначала скрыть список с помощью CSS, а затем добавить метод jQuery toggle () для этой ссылки. Во всяком случае, надеюсь, что это имеет смысл и полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...