質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

ajaxでのCompleted 500 Internal Server Errorを解決したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,948

NaojirouHisada

score 58

現在facebookのような友達申請機能を作成しています。

友達関係を管理するrelationshipsモデル

class CreateRelationships < ActiveRecord::Migration
  def change
    create_table :relationships do |t|
      t.references :follow, index: true
      t.references :followed, index: true
      t.string :status

      t.timestamps null: false

      t.index [:follow_id , :followed_id] , unique: true

    end
  end
end


と各ユーザーを管理するUserモデルがあります。

この二つの関係性はこうです。

relationshipモデル

class Relationship < ActiveRecord::Base
  belongs_to :follow , class_name: "User"
  belongs_to :followed , class_name: "User"
end


ユーザーモデル。
class User < ActiveRecord::Base

    has_one :member
    has_many :microposts
    has_many :comments

    has_many :following_relationships, class_name: "Relationship" , foreign_key: "follow_id" , dependent: :destroy
    has_many :following_users , through: :following_relationships , source: :followed

    has_many :follower_relationships, class_name: "Relationship" , foreign_key: "followed_id",dependent: :destroy
    has_many :follower_users, through: :follower_relationships , source: :follow



    has_secure_password

    accepts_nested_attributes_for :member

# 他のユーザーをフォローする
    def follow(other_user ,status)

        following_relationships.create(followed_id: other_user.id , status: status.status)


    end
   # フォローしているユーザーをアンフォローする
    def unfollow(other_user)

        following_relationships.find_by(followed_id: other_user.id).destroy
    end
   # あるユーザーをフォローしているかどうか?
    def following?(other_user)
        following_users.include?(other_user)
    end


end

statusを作ることにより、
友達申請->承認->友達成立という流れです。

友達申請->申請中までは良いのですが、
ajaxを使い、
Relationshipsのstatusをallow(承認)に更新処理をすると、

Completed 500 Internal Server Error in 93ms (ActiveRecord: 0.9ms)

ActionView::Template::Error (undefined method `each' for nil:NilClass):
    4:     
    5:    
    6:     <% loop do
    7:         follower                = followers.next
    8:         follower_relationship   = follower_relationships.next %>
    9: 
   10: <% if follower_relationship.status == 'allow' %>
  app/views/users/_follow_update.html.erb:7:in `next'
  app/views/users/_follow_update.html.erb:7:in `block in _app_views_users__follow_update_html_erb__922133743095404908_69892989505320'
  app/views/users/_follow_update.html.erb:6:in `loop'
  app/views/users/_follow_update.html.erb:6:in `_app_views_users__follow_update_html_erb__922133743095404908_69892989505320'
  app/views/relationships/update.js.erb:1:in `_app_views_relationships_update_js_erb__3383092756043455873_69893008020780'


  Rendered /usr/local/rvm/gems/ruby-2.2.1/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (1.5ms)
  Rendered /usr/local/rvm/gems/ruby-2.2.1/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (1.3ms)
  Rendered /usr/local/rvm/gems/ruby-2.2.1/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb (54.7ms)


このようなエラーが発生しました。

これを解決し、
うまく更新処理ができるようにしたいのですが、
できません。

お手数おかけしますが、
アドバイス宜しくお願いします。

友達申請をされたことを知らせるinfomation.html.erb

<div id="information" >


    <%= render 'follow_update' %>


</div>

友達を承認させるための更新処理を行う_follow_update.html.erb

<% followers = @followers.to_enum 
     follower_relationships = @follower_relationships.to_enum %>


    <% loop do
        follower                = followers.next
        follower_relationship   = follower_relationships.next %>

<% if follower_relationship.status == 'allow' %>


<% else %>

         <p><%=  follower.first_kana + "さんが友達申請をしてきました。"  %><br />
                   <%= "友達申請を承認しますか?" %></p>


        <%= form_for(follower_relationship,:url =>{ :controller => "relationships" , :action => "update" }, remote: true) do |f| %>




              <%= hidden_field_tag :follow_id , follower_relationship.follow_id %>
                <%=f.hidden_field :status %>


                <%= f.submit "承認"%>

<% end %>          


        <% end %>
<% end %>


この更新を行うrelationshipコントローラのupdateメソッド

def update

       @status = Relationship.find_by(params[:follow_id])


        if @status.update(:status => 'allow')

        else
            flash[:danger] = 'missing'
        end
    end


ajax操作を行うための記述のupdate.js.erb

$("#information").html("<%= escape_javascript(render ('users/follow_update')) %> ");
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

このControllerのActionに対応するViewがないというエラーなので、
Viewではなく json を返すようにすれば問題ないと思います。
具体的には update アクションの一番最後に下記のように書きます。

# jsonに渡すハッシュは適当です。
render status: 200, json: { message: 'OK' }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/13 18:18

    アドバイスありがとうございます!!!
    試した結果、
    エラーはなくなりましたが、
    statusの部分が更新されていませんでした。

    この原因はなんなのでしょうか(^^;)??

    また、
    htmlで返すことはだめなのでしょうか??

    キャンセル

  • 2016/02/13 18:26 編集

    すみません。
    RailsのAjaxオプションでしたね。

    `render status: 200, message: { }` の部分を消して、
    `app/views/relationships/edit.html`を作成し内容を
    下記のようにすれば描画されるかと思います。
    ```
    <%= @status %>
    ```

    上記のようにHTMLではなく単純にテキストを返したいだけなら
    `render json: @status` でも表示されるかと思います

    キャンセル

  • 2016/03/02 16:37

    返事が大変遅くなってしまい申し訳ありません。

    丁寧な説明ありがとうございます!!

    早速試してみます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる