2016-07-11 2 views
0

레일을 통해 새로운 "트윗"을 제출하고 AJAX로 처리하려고합니다. 400 개의 잘못된 요청 문제가 계속 발생합니다. 그럼에도 불구하고 트윗은 게시 중이며 서버는 200을 반환합니다. 도와주세요.레일 양식 및 AJAX 400 잘못된 요청 문제

오류가

이 TweetsController 번호로 2016년 7월 10일 20시 20분 21초 -0400 처리에 : 1 "/ 트윗을"POST를 시작 HTML 로 400 잘못된 요청에 완료 만드는 것입니다 2ms의 (액티브 : 0.0ms)

ActionController :: ParameterMissing (PARAM가 없거나 값이 비어 : 짹짹) : ​​

tweets.js

$(function(){ 

    //grab the click event 
    $('#new_tweet').on('submit', function(e){ 
    var valuesToSubmit = $(this).serialize; 
    console.log('point one') 
    //var self = $(this) 
    e.preventDefault(); 
    $('.tweets').html(''); 

    //start ajax function 
     $.ajax({ 
      url: $(this).attr('action'), 
      method: 'POST', 
      data: valuesToSubmit, 
      dataType: 'html' 
     }); 
    });// end of click event 
}); //end of on load function 

트윗 컨트롤러 # 행동

private 

def tweet_params 
    params.require(:tweet).permit(:message) 
end 

트윗 인덱스보기 모든 도움에 유래에 대한

<ul class="tweets"> 
    <% @tweets.each do |tweet| %> 
    <li class="tweet"> 
     <p><%= tweet.message %></p> 
     <time><%= tweet.created_at.strftime('%b %e, %l:%M %p') %></time> 
    </li> 
    <% end %> 
</ul> 

<%= form_for @tweet, remote: true do |f| %> 
    <%= f.text_area :message, placeholder: "What did you learn today?" %> 
    <%= f.submit "Tweet", id: "create-tweet" %> 
<% end %> 

감사를

def create 
@tweet = Tweet.new(tweet_params) 

if @tweet.save 
    if request.xhr? 
    render @tweet, layout: false 
    else 
    redirect_to root_path 
    end 
else 
    render :index 
end 

tweet_params을 만들!

+0

'tweet_params' 메서드는 어떻게 생겼습니까? – kasperite

+0

안녕 @kasperite는,이처럼 : (: 트윗) .permit (: 메시지) 나는이 문제를 알고 추측 끝 – IWI

+0

개인 데프 params.require을 tweet_params. 마지막 질문인데, 왜 당신의 ajax 요청에서''html ''즉''dataType : html''으로 데이터를 반환하겠습니까? – kasperite

답변

0

당신이 말한대로 트윗이 제대로 저장되기 때문에, 나는 아약스 응답이나이 라인 특히 render @tweet, layout: false과 관련이 있다고 생각합니다. 아래에서 내 제안을 시도 하시겠습니까?

html에 응답을 반환하는 대신 Rails가 js 응답을 생성하도록하십시오.

컨트롤러 :

def create 
    @tweet = Tweet.new(tweet_params) 
    if @tweet.save 
    respond_to do |format| 
     format.js 
     format.html { redirect_to root_path } 
    end 
    else 
    respond_to do |format| 
     format.js { alert("Error"); } 
     format.html { render :index } 
    end 
    end 
end 

JS :

$.ajax({ 
    url: $(this).attr('action'), 
    method: 'POST', 
    data: valuesToSubmit 
}); 

tweets 폴더 아래에 create.js.erb라는 파일을 만듭니다. 앱이 js 응답 (성공 또는 실패)을 반환하면 다음과 같이이 파일 내에서 DOM을 조작 할 수 있습니다.

var time = "<time><%= @tweet.created_at.strftime('%b %e, %l:%M %p') %></time>"; 
$('.tweets').append("<li class='tweet'>" + "<%= @tweet.message %>" + time + "</li>"); 

희망이 있습니다. 건배

+0

문법이 문제가되었습니다. $ (this) .serialize가 있었고 $ (this) .serialize()가 필요했습니다 ...... – IWI