'stars' %> </div> 星の部分: "> 'stars' %> </div> 星の部分: "> 'stars' %> </div> 星の部分: " />

Rails - サーバーからの500のJQuery Ajax POST(GETでも)

わかりました、私の脳はこれを見てから揚げられています!誰が間違っているのを見ることができますか? 1つの可能性は、Ajaxが正常に動作していれば、html.erbページで部分的にレンダリングする必要はありませんが、@profileオブジェクトが部分的に読み込まれたときにデータが取り込まれないことです。

さあ:

html.erb:

<div id="stars">
<%= r終わりer :partial => 'stars' %>
</div>

星の部分:

Stars! <%= @profile.stars %> <input type="submit" name="one" id="one" value="+1" message="<%= @profile.id %>">

javascript:

$(function() {
  $("#one").click(function() {
$.ajax({
    type: "POST",
    url: "/rate",
    dataType: "html",
    data: "prof="+this.getAttribute("message"),
    success: function(data){
        $("#stars").html(data);
        }
    });
  })
});

コントローラ:

  def rate
@rate_this_profile = Profile.find_by_id(params[:prof])
if @rate_this_profile
  @rate_this_profile.stars += 1

  respond_to do |format|           --Line 177
  if @rate_this_profile.save

    r終わりer :partial => "stars"     --Line 180

    flash[:success] = "Rated!"
  else
    flash[:success] = "Failed"
  終わり
終わり
終わり

終わり

ログ:

Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2011-12-18 22:01:51 +0000
Served asset /application.js - 304 Not Modified (3ms)


Started POST "/rate" for 127.0.0.1 at 2011-12-18 22:13:23 +0000
  Processing by ProfilesController#rate as HTML
   Parameters: {"prof"=>"3"}
   ←[1m←[35mProfile Load (0.0ms)←[0m  SELECT "profiles".* FROM "profiles" WHERE  "profiles"."id" = 3 LIMIT 1
  ←[1m←[36m (1.0ms)←[0m  ←[1mUPDATE "profiles" SET "stars" = 21, "updated_at" = '2011-12-18 22:13:23.493276' WHERE "profiles"."id" = 3←[0m
R終わりered profiles/_stars.html.erb (7.0ms)
Completed 500 Internal Server Error in 93ms

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

2: Stars! 3: <%= @profile.stars %> 4: <input type="submit" name="one" id="one" value="+1" message="<%= @profile.id %>"> 5:

app/views/profiles/_stars.html.erb:3:in `_app_views_profiles__stars_html_erb__1034491404_54471564' app/controllers/profiles_controller.rb:180:in `block in rate' app/controllers/profiles_controller.rb:177:in `rate' R終わりered c:/Ruby/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms) R終わりered c:/Ruby/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms) R終わりered c:/Ruby/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (37.0ms)
0
@profile は最初の使用時に自動的に作成され、 nil として開始するように @rate_this_profile 。だからあなたのバグがあります。私は「あまりにもローカライズされた」と締めくくっています。
追加された 著者 mu is too short,
rate が呼び出されたときに @profile が定義されることを期待するのはなぜですか?
追加された 著者 mu is too short,
ログは何を言いますか?
追加された 著者 John Feminella,
@spuriosity @profile を初期化する部分を表示する必要があります。なぜなら、Ajaxのポストメソッドはそうでないため、部分的なレンダーの前に実行されているからです。 @profile nil です。 * previous @要求の @profile が有効であるという新たな要求をしたとき、あなたは何を考えますか?
追加された 著者 Dave Newton,
@ profile.stars という行を @profile.try(:stars)に変更し、それでもエラーが出力されるかどうか確認してください。
追加された 著者 Batkins,
format.jsの場合に.js.erb経由で応答を処理しない理由は何ですか?私は初心者ですので、それが役に立たなければコメントを無視してください。私は頭痛の2日後に私のアヤックスのことが働いたので、言及を考えた。
追加された 著者 Tabrez,
@muistooshort私はファイルの一部しか表示していません。私が関連すると思った部分。もっと見たいと思ったら、お尋ねください。プロファイルは、残りのhtmlではnilではありません。それはそれがゼロであるという部分的なものでしかない。
追加された 著者 spuriosity,

1 答え

あなたのコントローラーは、形式に関係なく部分的な星を描画しています。 rateメソッドで@profileを設定すると、それは修正されますか?

別の、おそらくよりエレガントなオプションは、あなたのレンダリングをこれに変更することです:

render :partial => 'stars', :locals => { :profile => whatever_you_want_here }

そして、 "@profile"ではなく "profile"を使うようにpartialを変更してください。

1
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript