8

左側にプロジェクト、ブログなどのリンクを含むサイドバーがあるユーザーのダッシュボード ページがあります。「プロジェクト」リンクなどのリンクをクリックすると、メイン エリアでプロジェクトのビューが表示されるようにしたいと考えています。ページを更新せずに読み込みます (ビューはプロジェクトの箇条書きリストになります)。これを AJAX で実現しようとしていますが、うまくいきません。

これが私がそれがうまくいくはずだと思う方法です。ユーザーはサイドバーのリンクをクリックしますshow.html.erb

<%= link_to 'Projects', '/dash', remote: true %>

whereは、次のようにファイル/dash内の users#show にルーティングするように構成されています。config/routes.rb

match '/dash' => 'users#show'

そして、コントローラーshowでアクションが呼び出されます。users_controller.rb

def show
    @user = User.find(params[:id])
    @projects = @user.projects

    respond_to do |format|
      format.html # renders show.html.erb
      format.js   # renders show.js.erb
    end
end

どこshow.js.erbで実行されます。私のshow.js.erbファイルには次の1行があります:

$('#ajax').html("<%= escape_javascript(render(:partial => 'projects/index')).html_safe %>");

そして、それは my の #ajax div を変更することになっていますshow.html.erb:

<div id="ajax">
  <%= render :template => 'projects/index' %>
</div>

app/views/projects/index.html.rb@projects を受け取り、次のようにリストを提供します。

<% @projects.each do |project| %>
  <p><%= project.name %></p>
<% end %>

明らかに、これは機能していないため、私は間違ったことをしています。私は何を間違っていますか?他の場所で変更する必要があるコードはありますか? 私は Rails 3.2.13 を使用しているので、//=jquery必要な jQuery および AJAX 機能がインポートされている必要があります//=jquery_ujsapp/assets/javascripts/application.js

4

1 に答える 1

11

問題は、show.js.erbファイルでパーシャルをレンダリングしようとしているが、パーシャルではないファイルを渡していることです。部分ファイルはアンダースコアで始まります_

したがって、コードの重複を避けるために、次のようにします。

# app/views/projects/show.js.erb
$('#ajax').html("<%= escape_javascript(render :partial => 'index', :locals => { :projects => @projects } ) %>");

# app/views/projects/index.html.erb
<%= render :partial => 'index', :locals => { :projects => @projects } %>

# app/views/projects/**_**index.html.erb
# Include here the code that you previously had in index.html.erb
# Don't forget to change @projects to projects
<% projects.each do |project| %>
  <p><%= project.name %></p>
<% end %>

また、matchGET メソッドと POST メソッドの両方でルートにアクセスできるようにする必要はほとんどないため、ルートでは使用しないでください。getの代わりに使用してみてくださいmatch

于 2013-06-22T01:28:21.227 に答える