2013-01-10 6 views
2

레일 패키지에 posts 스캐 폴드가 생성되었고 포스트 모델에 upvotedownvote 열이 추가되었습니다. 뷰 파일에 "upvote"버튼을 추가하고 upvote 버튼을 누를 때 AJAX 호출을하고 데이터베이스를 쿼리해야하지만 upvote 버튼에는 실제 레일이 없습니다. <form>이 첨부되어 있습니다. 이 AJAX 호출을 만들고 upvoted 게시물에 대해 upvote를 데이터베이스에 추가하려면 어떻게해야합니까?양식이없는 레일에서 AJAX 요청하기

나는이 AJAX 호출 할 때 :

$('.up,.down').click(function(){ 
    $.ajax({ 
     type: 'POST', 
     url: '/posts', 
     dataType: 'JSON', 
     data: { 
     post: { 
      upvote: 1 
     } 
     }, 
     success: function(){ 
     alert('success') 
     } 
    }); 
    }); 

그것은 500 오류를 반환합니다. 여기서 나는 어디로 갈 것인가? config/routes.rb에서 다음

<%= link_to post_upvote_path(post), :remote => true, :method => "put" %> 
<%= link_to post_downvote_path(post), :remote => true, :method => "put" %> 

을 :

+0

두 가지 사항이 있습니다. 1) 실제로 어떤 요청이 보내지 는가? (크롬 개발자 도구를 사용하여 네트워크를 보아라.) 2) 레일은 무엇을 받는가? 당신이 레일 500을 치는 것처럼 들리네. development.log를 확인하십시오. 그것이 받았던'params '을 보아라. –

+0

2013 년 1 월 1 일에 127.0.0.1에서 POST를 시작했습니다./posts 16:55:16 -0800 PostsController # 처리 : JSON으로 작성 매개 변수 : { "post"=> { "upvote"=> "1 "}} 경고 : CSRF 토큰 인증을 확인할 수 없습니다. 1ms에 500 내부 서버 오류가 발생했습니다. ' – alt

+0

아. CSRF 토큰이 필요합니다. 당신의'application.html'에'% = csrf_meta_tag %>'가 있는지 확인하십시오. 'jquery-rails' 통합은이 메타 필드를 헤더에 추가해야합니다. –

답변

6

당신은 예를 들어 link_to 도우미 에 :remote => true 속성을 사용할 수

resources :posts do 
    put "upvote", :to => "posts#upvote", as: :upvote 
    put "downvote", :to => "posts#downvote", as: :downvote 
end 

은 그때는 아마 이미 같은 게시물 컨트롤러에서 투표를 처리 게시자 ID가 params[:id]이면

Here is an intro to rails flavored unobtrusive javascript

업데이트
이 당신이 당신의 경로의 모든 목록을 제공합니다 터미널로 이동

rake routes | grep vote 

을 입력, 생성 된 upvote에와 downvote 경로를 보려면 "투표 "이름으로. 또는 모두 rake routes을 입력하여 모든 항목의 목록을 가져 오십시오. 첫 번째 열은 앱에서 그것을 사용하는 그것의 끝에 '_path'를 추가, 지정된 경로입니다 - 위의

post_upvote PUT /posts/:id/upvote(.:format) posts#upvote 

로 그리고 당신은 당신이 이러한 작업을 할 것가 PostsController에서 볼 것 post_upvote_path 같은 :

class PostsController < ApplicationController 
    ### 
    # index, show... other RESTful actions here 
    ### 


    def upvote 
    @post = Post.find params[:id] 
    # code for however you are voting up the post here 
    end 

    def downvote 
    @post = Post.find params[:id] 
    # code for however you are voting down the post here 
    end 
end 
+0

어디에서 post_upvote_path (post)를 만들 수 있습니까? 컨트롤러? 어떻게 생겼을 까? 이 방법이 application.js 파일에 $ .AJAX() 요청보다 나은가요? – alt

+1

더 많은 예제를 추가했습니다. 이것은 "Rails Way"를 사용하는 것이지만, 특정 상황에서는 종종'$ .ajax() '를 사용합니다.나는 이런 식으로 가고, 고통을 준다면 다른 것을 시도해 볼 것입니다. – mraaroncruz

+0

철저한 답변 주셔서 감사합니다! 마지막 질문 하나, 당신은 "당신의 경로에서 ..."라고 말하면 경로를 의미합니까? RB 파일입니까? – alt