2011-07-17 5 views
0

레일스 애플리케이션 용 주석 시스템을 구현하려고했습니다. 내 응용 프로그램의 모든 이벤트는 자신의 페이지이고 페이지의 주석 스레드입니다. 사용자가 아약스를 사용하여 의견을 제출할 수 있기를 바랍니다. 나는 RailsCast 136을 따르려고 노력했다. RailsCast 136은 기본적으로 내 앱에서 일하기를 원한다. 내가 코멘트를 게시 할 때마다 그러나, 아약스 요청을 통해려고하고 있지 않다, 나는 오류를 받고 있어요 :레일에 jquery가있는 Ajax 제출이 작동하지 않습니다.

Started POST "/events/undefined" for 127.0.0.1 at 2011-07-17 00:39:16 -0400

ActionController::RoutingError (No route matches "/events/undefined"):

가 여기 내 events_controller 내 show 액션에 대한 코드입니다.

def show

@event = Event.find(params[:id]) 

@comment = Comment.new 

session[:event_id] = @event.id 

@comments = @event.comments.reverse 
end 

다음은 내 이벤트보기보기에 대한 내 의견 양식의 코드입니다.

<%= form_for(@comment, :remote => true) do |f| %> <% if signed_in? %>

<%= f.label :author %>
<%= f.text_field :author, :value => current_user.name %>

<% else %>

<%= f.label :author %>
<%= f.text_field :author %>


<% end %>

 <p><%= f.label :content %><br /> 
     <%= f.text_field :content %></p> 

     <p><%= f.submit %></p> <% end %> </div> 

다음은 내 actions_controller에 작성한 액션입니다.

def create 
    @comment = Comment.create!(params[:comment]) 
    @comment.event_id = session[:event_id] 
    session[:event_id] = nil 
    flash[:success] = "Comment sent!" 
    respond_to do |format| 
    format.html { redirect_to @comment.event } 
    format.js 
    end 
    end 

다음은 아약스로 게시하기위한 jQuery 코드입니다. 그것은 RailsCast가 제시 한 코드와 거의 같습니다 136

jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} })

$(document).ready(function(){ $("#commentform").submit(function(){ $.post($(this).attr("action"), $(this).serialize(), null, "script"); return false; }) })

아무도 잘못 될 수있는 아이디어가 있습니까? 나는 레일스와 웹 개발에 대해 처음 보았고이를 수정하는 데 도움을 주셔서 감사합니다.

편집 : 문제를 해결하고 해결할 수있었습니다. 나는 근본적으로 vinceh가 내 경로를 중첩하는 것 외에도 레이아웃 한 솔루션을 따라 갔고 작동하도록했습니다. 고마워.

덕분에 너무 많은, 시드

답변

0

내가 오른쪽 상단에 2 일을 참조하십시오. 먼저 양식을 보낼 위치를 지정하지 않습니다. 그래서 당신은

<%= form_for @comment, :url => {:controller => :comments, :action => :create}, :remote => true do |f| %> 

    <% if signed_in? %> 

    <%= f.label :author %> 
    <%= f.text_field :author, :value => current_user.name %> 

    <% else %> 

    <%= f.label :author %> 
    <%= f.text_field :author %> 

    <% end %> 

    <p><%= f.label :content %><br /> 
    <%= f.text_field :content %></p> 

    <p><%= f.submit %></p> 
<% end %> 

그런 다음 당신이 필요에 즉

match "comments/create" => "comments#create" 

, 당신의 routes.rb 폴더에서 해당 경로를 추가하는 것을 새로운 것을 생산하고 있는지 확인하는 것이 변경해야합니다. 알려 주시면 답변을 계속 업데이트하겠습니다.

좋은 AJAX 튜토리얼을 원한다면 this을 읽어보십시오!

행운을 빈다.

+0

안녕하세요 vinceh, 제안 해 주셔서 감사합니다. 그 코드 줄을 추가했지만 동일한 오류 메시지가 로그에 표시됩니다. 나는 내가 만든 액션을 코딩 한 방식에 문제가 있다고 생각한다.제출을 클릭하면 url/events/undefined가로드되어 오류를 일으키는 것으로 생각됩니다. – Sid

+0

좋아, 이제 몇 가지 문제가 더있다. 우선, 양식을 제출할 때 format.js 대신 format.html을 사용하여 양식을 계속 처리합니다 (POST 시작시 "/ comments"에 127.0.0.1 오류가 발생 함) 2011-07-17 02:51 : 50 -0400 CommentsController로 처리 # HTML로 작성 ). 다른 문제는 주석이 만들어 질 때 레일스가 세션 해시에서 event_id를 읽을 수 없으며 내 의견에 event_id를 할당 할 수 없다는 것입니다. 모든 도움에 다시 한 번 감사드립니다! – Sid

0

vinceh의 대답에 대한 귀하의 의견을 토대로 route.rb에 리소스를 올바르게 중첩 시켜서 스스로를 편하게 만들 수 있는지 궁금합니다. 과 같이, 블록을 제공하는 이벤트 경로 : 기존의 수정

<%= form_for(@comment, :url => event_comments_url(@event), :remote => true) do |f| %> 

이 방법은 자동으로 선택할 것입니다 : 양식은 여전히 ​​작동하지 않는 경우

resources :events do 
    resources :comments, :only [:create] 
end 

그런 다음,이 시도 게시물의 일부인 params의 : event_id.

+0

안녕하세요 저스틴, 포인터 주셔서 감사합니다. 지금은 respond_to 블록이 HTML로 작업을 올바르게 처리하고 있지만 format.js를 실행하고있는 지점에 있습니다. format.html 줄을 주석 처리하려고했지만 제출을 시도하면 http : ///.0.0.0:3000/events/1/comments로 리디렉션되었습니다. 또한 또 다른 메모로, reply_to 블록은 comment.save 인 if 문에 포함하지 않으면 작동하지 않습니다. 어떤 아이디어? 다시 한 번 감사드립니다! – Sid

관련 문제