0

show.html.erbファイルに2つのタブ/リンクがあるナビゲーションメニューがあります。でUsersController.rb、ajaxを使用してタブの異なる部分をレンダリングしたいと思います。

私には、コンテンツを表示したい場所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 %>

だから私はこの問題を解決しますが、ソースをチェックインおよびチェックアウトします。そして、jsファイルがアプリにロードされていないことに気づきました。

だから私はこれを変更しました:

<%= javascript_include_tag :defaults %>

これに:

<%= javascript_include_tag "application" %>

そして、必要なすべてのjsファイルをロードしました。

しかし、次のエラーが発生します。

ActionView::Template::Error (undefined method `friends' for nil:NilClass):
4

2 に答える 2

0

上記のコメントで示唆されているように_college_friends.html.erb_highschool_friends.html.erb

これらには、ロードしたいHTMLが含まれます。$('#profile-data').html()

テンプレートエラー:

とを定義@userしていません。したがって、あなたの見解は、そこにないその行動から要求しています。college_friendshighschool_friends@user

于 2012-07-28T05:26:20.163 に答える
0

あなたは得ています

ActionView::Template::Error (undefined method `friends' for nil:NilClass):

なぜなら

<% groups = @user.friends.group_by(&:college_name) %>

設定する必要@userがあります。

ブランドンが提案したように、試してみてください

def college_friends
  @user = User.find(params[:id])
  respond_to do |format|
    format.js
  end
end

しかし

これを実現するには、リンクルートを変更して、次のようなユーザーIDを含める必要があります。

match "college_friends/:id" => "users#college_friends", :as => "college_friends"

とあなたのリンクで

<li><%= link_to "College friends", college_friends_path(@user), :remote => true %></li>
于 2012-07-29T21:59:58.043 に答える