2

私はこの ajax コールバック ビジネスを理解しようとしていますが、うまく機能させることができませんでした。私はたくさんのSOの質問、チュートリアルなどを見てきましたが、どうやらこれがどのように機能するかを理解していないようです. パーシャルを含む div の内容を更新しようとしています。これは、ユーザーがリンクをクリックし、ajax を介してアイコンを更新する、標準の like/unlike タイプ関数です。私の ajax リモート リクエストは正常に機能していますが、コールバックを機能させることができません。これが私のshow.html.erbファイルです:

<table class="v-table">
    <tr>    
        <td>
            <div class="favorite">
                    <%= render 'vendors/favorite' %>
            </div>
        </td>
        <td><h2><%= image_tag @vendor.image_url %></h2></td>
        <td><%= @vendor.address %></td>
    </tr>
</table>

パーシャルは次のfavoriteとおりです。

<% if current_user.voted_for?(@vendor) %>
    <%= link_to image_tag("Heart (2).png"), 
        { :controller => :vendors, 
        :action => 'vote_against_vendor', :vendor_id => @vendor.id},
        { :method => 'delete', :remote => true }%>
<% else %>
    <%= link_to image_tag("Heart (1).png"), 
        { :controller => :vendors, 
        :action => 'vote_for_vendor', :vendor_id => @vendor.id},
        { :method => 'post', :remote => true} %>
<% end %>

関連するコントローラーアクションは次のとおりです。

respond_to :js

def show

    @vendor = Vendor.find_by_id(params[:id])
end

def vote_for_vendor

    vendor = Vendor.find(params[:vendor_id])
    current_user.vote_for(vendor)
    render :toggle
end

def vote_against_vendor

    vendor = Vendor.find(params[:vendor_id])
    current_user.unvote_for(vendor)
    render :toggle
end

私の toggle.js.erb ファイル:

$("#favorite").html("<%= escape_javascript render('favorite') %>");

私はjsとajaxを使用するのが本当に初めてです。助けてください! 前もって感謝します。

エラーログ

リモート トランザクションを正しくコミットした後、次のエラーが発生します。

Rendered vendors/_favorite.html.erb (1.3ms)
  Rendered vendors/toggle.js.erb (2.6ms)
Completed 500 Internal Server Error in 47ms

ActionView::Template::Error (Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id):
    1: <% if current_user.voted_for?(@vendor) %>
    2:  <%= link_to image_tag("Heart (2).png"), 
    3:      { :controller => :vendors, 
    4:      :action => 'vote_against_vendor', :vendor_id => @vendor.id},
  app/views/vendors/_favorite.html.erb:1:in `_app_views_vendors__favorite_html_erb___385976980778737159_2184308220'
  app/views/vendors/toggle.js.erb:1:in `_app_views_vendors_toggle_js_erb___3800164439665893406_2169792040'
  app/controllers/vendors_controller.rb:39:in `vote_for_vendor'


  Rendered /Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.7ms)
  Rendered /Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.3ms)
  Rendered /Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (11.1ms)

これが何を意味するかわからない:ActionView::Template::Error (Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id):

4

3 に答える 3

2

instanceOK、コントローラーのnotlocal変数にモデルを割り当てる必要があります。

@vendor = Vendor.find(params[:vendor_id])

残りは私には良さそうです。

于 2013-09-10T23:10:17.580 に答える