0

show.html.erbファイルに2 つのタブ/リンクを含むナビゲーション メニューがUsersController.rbあります。

には、コンテンツを表示する場所show.html.erbという名前の div があります。profile-dataだから私はこのようなことをします:

リンク構造:

<li><%= link_to "College friends", college_friends_path, :remote => true %></li>
<li><%= link_to "Highschool friends", highschool_friends_path, :remote => true %></li>

ルートを定義します。

match "college_friends" => "users#college_friends", :as => "college_friends"
match "highschool_friends" => "users#highschool_friends, :as => "highschool_friends"

そして、UserController.rb で必要なメソッドを定義します。

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def college_friends
    respond_to do |format|
      format.js
    end
  end

  def highschool_friends
    respond_to do |format|
      format.js
    end
  end
end

最後に JS ファイルがあります。

*college_friends.js.erb*

$('#profile-data').html("<%= escape_javascript(render(:partial => 'college_friends')) %>");

*highschool_friends.js.erb*

$('#profile-data').html("<%= escape_javascript(render(:partial => 'highschool_friends')) %>");

部分的なコード: _college_friends.html.erb

<% groups = @user.friends.group_by(&:college_name) %>
<% sorted_groups = groups.sort_by{|key, values| values.count}.reverse %>
<% sorted_groups.each do |collegename, friends| %>
<% next if collegename.blank? %>
<div class="contentbox">
    <div class="box-header">
        <h3><%= collegename %></h3>
        <div class="meta-info">
            <p><i class="icon-map-marker"></i> Malmö</p>
            <p><i class="icon-user"></i><span class="count"> <%= friends.count %></span> vänner</p>
        </div>
    </div>
    <ul class="friends-list">
        <% friends.map do |friend| %>
        <li><%= image_tag(friend.image) %>
            <% end %> 
        </ul> 
    </div>
<% end %>

リンクをクリックしても何も起こらず、コンソールに次のエラーが表示されます。

Started GET "/universitet_friends" for 127.0.0.1 at 2012-07-29 01:53:39 +0200
Processing by UsersController#universitet_friends as JS
  Rendered users/_universitet_friends.html.erb (1.6ms)
  Rendered users/universitet_friends.js.erb (3.1ms)
Completed 500 Internal Server Error in 7ms

ActionView::Template::Error (undefined method `friends' for nil:NilClass):
    1: <% groups = @user.friends.group_by(&:college_name) %>
    2: <% sorted_groups = groups.sort_by{|key, values| values.count}.reverse %>
    3: <% sorted_groups.each do |collegename, friends| %>
    4: <% next if collegename.blank? %>
  app/views/users/_universitet_friends.html.erb:1:in `_app_views_users__universitet_friends_html_erb___1983680250475155079_70236040373720'
  app/views/users/universitet_friends.js.erb:1:in `_app_views_users_universitet_friends_js_erb__1317362850668628869_70236044930260'
  app/controllers/users_controller.rb:19:in `universitet_friends

どんな助けでも大歓迎です。

4

2 に答える 2

0

ActionView::Template::Error (nil:NilClass の未定義メソッド「friends」):

これは、@user 変数が nil であることを示しています。これは、AJAX 要求のためにコントローラーに戻ったときに、実際に @user 変数を設定しなかったために発生しました。リクエスト間で持続しません。ajax リクエスト中にその変数を渡す必要があります。これを行う 1 つの方法は、ajax URL に user_id パラメータを追加することです。

于 2012-07-29T00:17:37.570 に答える
0

こんなこともできるかも

<%=link_to "Highschool friends", college_friends_path(:user_id => @user.id), :remote => true %>

ただし、最善の方法は、user_id パラメータを ajax URL に渡すことです。リンクの「クリック時」イベントで ajax リクエストを起動できます。

于 2014-12-01T08:45:05.567 に答える