2013-08-05 5 views
5

레일즈 3에서는 작동하지 않지만 레일즈 4에서는 작동하지 않는 코드를 사용합니다. 터보 링크에 기인 한 것 같지만 그다지 잘 모르겠습니다.레일 4 터보 링크는 여러 번 폼을 제출합니다.

보기 :

a/v/m/_new_comment.slim                                
.new-comment                                   
- if current_user 
    = render "editor_toolbar" 
    = form_for(Comment.new, :remote => true, :url => mission_comments_path(@mission)) do |f| 
    = f.text_area :content, :class => "span10", 
    :rows => "4", :tabindex => "1" 
    #preview.hidden 
    = "Loading..." 
    = f.submit t("missions.submit_comment"), 
    "data-disable-with" => t("missions.submitting"), 
    :class => "btn btn-primary", :tabindex => "2" 
- else 
    = render "need_login_to_comment" 

컨트롤러 :

def create 
    @mission = Mission.find(params[:mission_id]) 
    @comment = @mission.comments.build(comment_params) 
    @comment.user = current_user 

    if @comment.save 
    @mission.events.create(user: current_user, action: "comment") 
    render layout: false 
end 

및 JS :

내 문제를 해결, 여기에 코드입니다3210
<% if @comment.errors.any? %>                               
    $(".new-comment textarea").focus(); 
<% else %> 
    $(".comments").append("<%= j (render @comment, :index => @mission.comments.count-1) %>"); 
    $(".new-comment #preview").addClass("hidden").html(''); 
    $(".new-comment textarea").css("display", "block").val(''); 
    $(".editor-toolbar .preview").removeClass("active"); 
    $(".editor-toolbar .edit").addClass("active"); 
<% end %> 

이 코드에 대한 두 가지 질문이 있습니다. 먼저 컨트롤러 코드가 작동하지 않습니다. js 코드는 클라이언트로 전송되지만 실행되지 않습니다. 동작 하단에 render layout: false을 추가해야합니다. 필요하지 않습니다. on 레일즈 3

두 번째 질문 :이 페이지를 다시 방문하면 주석 기능이 작동하지만 다른 페이지의 링크를 클릭하여이 페이지로 이동하면이 양식이 아약스 요청 호출을 여러 번 발생시킵니다. 여러 번 의견이 생성됩니다.

감사의 말씀 덕분에

+0

- 연결없이 작동하는지 확인하십시오. [터보 링크를 제거하는 방법] (http://blog.steveklabnik.com/posts/2013-06-25-removing-turbolinks-from-rails-4) –

+0

application.js 파일에서 터보 링크를 제거하면 작동합니다. –

답변

17

에서 JS 파일을 포함하여이 문제를 해결할 수

+4

조언 해 주셔서 감사합니다! 나에게 많은 도움이된다. 한 시간 동안 무엇이 문제인지 알 수 없다! 실제로 설명서의 어딘가에 있어야합니다. 바로 전에 스크립트를 옮기는 것이 좋습니다. –

1

문제가 발생할 수있는 한 가지 이유는 모든 페이지에 js를 포함시키는 경우입니다. js를 머리에 추가하고 여러 페이지에 포함 시키면 여러 번 ajax를 바인딩 할 수 있습니다. 그것은 내가 본 것에서 js를 어떻게 포함하고 있는지 분명하지 않다는 것이 었습니다. 당신은 가능성 만, 덕분에 모든 당신의 도움이 머리에 몸에서 = javascript_include_tag "application", "data-turbolinks-track" => true를 이동하여이 문제를 해결하여 application.js

+0

전용 js 파일을 응용 프로그램에 포함 시키십시오. 그렇기 때문에 이것이 부분적으로 포함 된보기 코드가 아니라 이유라고 생각할 수 있습니다. 이것이 이유 일 수 있습니까? –

8

당신은 몸에 둘 수 있습니다, 당신은 단지 필요 스크립트 태그에 추가 :

"data-turbolinks-eval" => false 

을 일반적으로 turbolinks와 함께, 그것은 확실히 코드가 "멱등"이되어 있는지 확인하는 것이 가장 좋습니다, 그래서 한 번 이상 실행하는 경우, 바인딩은 한 번 이상 설치가 더받지 않습니다.

이 작업을 수행하는 가장 좋은 방법은 $ ('ㅋ') 대신이다 바인드(), 최초의 바인딩을 해제 호출합니다.

$('blah').unbind('click').bind('click', function() { 
난 당신의 특정 코드에 대해 언급 할 수는 없지만 터보를 제거 시도 할 수 있습니다
+0

감사합니다. 모든 바인딩에 대해 바인딩을 해제하면 성가신 것 같습니다. –

+0

예. 그것을 시도하고 대신 해결할 몇 가지 복잡한 플러그인이 있지만 unbind() 훨씬 더 간단하고 더 효과적이라고 발견했습니다,하지만 좀 못생긴 추가 않습니다! – Kevin

+1

바인딩을 해제하고 다시 바인딩하는 것이 아니라 '$ (document) .on ('click ','.blah ', function (e) {});'을 수행하는 것이 좋습니다. –

관련 문제