9

projectモデルを持つアプリケーションを作成しました。モデルにはいくつかの情報が保存されており、ユーザーはproject(モデルを使用してcomment) にコメントを追加できます。プロジェクトのショー ビューで、ユーザーが "info" パーシャル (プロジェクト情報を含む) と "comment" パーシャル (プロジェクトに書かれたコメントを含む) を切り替えることができるようにしたい。 AJAX というわけで、Information と Comments の 2 つのボタンを用意します。

これで、「リモート リンク」に基づいてパーシャルをレンダリングする方法がわかりましたが、どのリンクがクリックされたかを調べる必要もあります。これまでのところ、1 つのリンクが次のようにクリックされると、1 つのパーシャルをレンダリングできます。

// In show.html.haml

= link_to("Information", :project, :id => "link_one", :remote => true)
= link_to("Comments", :project, :id => "link_two", :remote => true)

#partial_window


// In show.js.haml
$("#partial_window").html("#{j(render("comments"))}")

_comment.html.hamlこれで、リンクの 1 つをクリックするとパーシャルがレンダリングされます。私が知る必要があるのは、どのリンクがクリックされたかを確認、適切なパーシャルをレンダリングする方法です:_info.html.hamlまたは_comments.html.haml.

よろしくお願いします。

4

1 に答える 1

24

このようなものが機能するはずです。ネストされたルートを使用します。ryanのスクリーンキャスト(少し古いですが、要点がわかります)またはネストされたフォームに関するこのより更新されたバージョン(同じ原則を使用)を確認してください。更新されたバージョンの料金を支払う必要がありますが、私のRailsCastサブスクリプションは月額$9以上の価値があると思います。また、ここに例のドキュメントがあります。

config/routes.rb

resources :projects do
  resources :comments
end

comments_controller.rb

class CommentsController < ApplicationController
  def index
    project = Project.find params[:project_id]
    @comments = project.comments
    respond_to do |format|
     format.html #responds with default html file
     format.js #this will be the javascript file we respond with
    end
  end
end

views/comments/index.js.erb

$('#holderDiv').empty().append('<ul> <%= j render @comments %> </li>')

commentこれは、部分を探して、のコメントごとにそれをレンダリングする、気の利いたレールを使用し@commentsます。jヘルパーはjavascriptをエスケープし、レンダリングされたパーシャルをappend関数に挿入します。

views/comments/_comment.html.erb

 <li> <%= @comment.description %> </li>

これで、をクリアし#holdingDivてコメントを挿入しました。のためinformationに、多分このようなもの:

projects_controller.rb

class ProjectsController < ApplicationController
  def index
    @project = Project.find params[:id]
    respond_to do |format|
      format.html
      format.js
    end
  end
end

views/project/index.js.erb

 $('#holderDiv').empty().append('<%= j render 'information', information: @project.information %>')

views/project/_information.html.erb

<h2>
  <%= information.title %>
</h2>
<p>
  <%= infomration.details %>
</p>

次に、リモートリンクは次のようになります。

= link_to("Information", @project, :remote => true)
= link_to("Comments", project_comments_url(@project), :remote => true)

私はあなたのデータ構造が何であるかについていくつかの仮定をしなければなりませんでした。私があなたを混乱させた場所を教えてください。

また、タイプミスがあると思います。申し訳ありません。私はこれをテストしませんでした、ただ頭のてっぺんから外れました。

于 2012-12-19T18:16:50.363 に答える