2014-09-29 8 views
2

비슷한 응용 프로그램을 만들기 위해 중첩 된 양식의 this railscast을 팔로우하고 있습니다. ---> 2. 질문 ---> 3. 그래서 사용자가 설문 조사를 작성하고 추가 할 수 있습니다 부분 복수형 부분 변경

답변/

  1. 설문 조사 :

    라이언의 응용 프로그램에서

    그는 같은 구조를 가지고 질문을 삭제하고 해당 답변을 추가/삭제할 수 있습니다.

    나는 조금 다르게하려고합니다.

    1. 설문 조사 ---> 2. 질문 ---> 3. 답변 또는 사용자가 질문을 만든 후 사용자가 답변을 생성 할 수 있습니다, 내 응용 프로그램의

    코멘트 : 내가 가진 (Ryan의 앱처럼). 그러나 각 대답 옆에 선택 상자가 있는데, 기본값은 "대답"이고 다른 하나는 "주석"입니다. Ryan의 앱과 기본적으로 동일한 기능을 사용하려고하지만 두 테이블이 있습니다. 의 댓글 테이블과 의 답변은입니다.

    내 코드를 모방 등의 부분적인 외모 내 answer_fields을 제외하고 railscast :

    <fieldset> 
        <%= f.label :content, "Answer" %> 
        <%= f.select :switch_answer_table options_for_select(["Answer", "Comment"]), class: "change-type" %> 
        <%= f.text_field :content %> 
        <%= f.check_box :_destroy %> 
        <%= f.label :_destroy, "remove" %> 
    </fieldset> 
    

    나는처럼 보이는 부분 comment_fields 있습니다

    <fieldset> 
        <%= f.label :content, "Comment" %> 
        <%= f.select :switch_answer_table options_for_select(["Comment", "Answer"]), class: "change-type" %> 
        <%= f.text_field :comment_content %> 
        ... (leaving out some stuff) ... 
        <%= f.check_box :_destroy %> 
        <%= f.label :_destroy, "remove" %> 
    </fieldset> 
    

    내 question.rb 모델의 모습을 :

    class Question < ActiveRecord::Base 
        belongs_to :survey 
        has_many :answers 
        has_many :comments 
        accepts_nested_attributes_for :answers, allow_destroy: true 
        accepts_nested_attributes_for :comments, allow_destroy: true 
    end 
    

    저는이 문제를 해결하기 위해 노력하고 있습니다. 내 jQuery는 지금까지 이와 같이 보입니다 :

    jQuery -> 
        $('form').on 'click', '.remove_fields', (event) -> 
        $(this).prev('input[type=hidden]').val('1') 
        $(this).closest('fieldset').hide() 
        event.preventDefault() 
    
        $('form').on 'click', '.add_fields', (event) -> 
        time = new Date().getTime() 
        regexp = new RegExp($(this).data('id'), 'g') 
        $(this).before($(this).data('fields').replace(regexp, time)) 
        event.preventDefault() 
    
        $('form').on 'change', '.change-type', (event) -> 
        # Confused on how to change partials 
    

    기본적으로 선택한 응답/설명의 일부만 onChange하는 방법이 필요합니다.

+1

가 처리, unluss 너 아약스 야. 그렇지 않은 경우 선택 양식의 변경 이벤트에서 두 양식을 작성하고 양식을 숨기거나 숨김보기를 관리하십시오. – lcguida

답변

2

먼저 Parts (answer_fields 및 comments_fields)를 양식과 함께 렌더링해야합니다.comments_partial에서

은 커피 스크립트와 파셜의 <fieldset style="display:none">

변경 가시성 <fieldset> 교체 : 트릭을 할

$('form').on 'change', '.change-type', (event) -> 
    $('.change-type').each -> 
    $(@).closest('fieldset').each -> 
     if $(@).is(':visible') 
     $(@).find('input').val('')   # reset all filels to empty values 
     $(@).toggle() 

나는 일을.

는 난 단지 입력 필드를 취소하지만 숨겨진 요소 드 (같은 hraynaud 말한다) 저장 그들 모두가

2

아직 테스트하지 않았지만 아마도 dependent-fields-rails을 사용하려고합니다. 선택 상자의 상태에 따라 설명 상자 나 대답 상자 중 하나를 표시 할 수 있습니다.

GitHub의 페이지에 주어진 예제 (간단한 양식을 사용하지만, 당신은 당신의 form_for에 동일하게 적용 할 수 있습니다) :

= simple_form_for(@filing) do 
    = f.input :registration_office, collection: ['habm', 'dpma'] 

    .js-dependent-fields[data-select-id='filing_registration_office' data-option-value='habm'] 
     = f.input :language, collection: ['english', 'german'] 

그럼 난 당신이 예를 들어 당신의 has_many 관계를 만족 fields_for 사용 같아요

f.select :switch_answer_table, collection: ['answer', 'comment'] 
    .js-dependent-fields[data-select-id='question_switch_answer_table' data-option-value='answer'] 
     f.fields_for :answers do |abuilder| 
     ... 
    .js-dependent-fields[data-select-id='question_switch_answer_table' data-option-value='comment'] 
     f.fields_for :comments do |cbuilder| 
     ... 

다시 한번 말하지만, 가장 좋은 추측은 아니지만 잘하면 올바른 방향으로 움직입니다.

3

알레한드로의 babio가 올바른지 방지하기 위해이 있어야합니다. 두 부분을 모두 렌더링합니다. 그들 중 한 명에게 전시 스타일을 제공하십시오 : none 그리고 coffescipt onchange 처리기에서 클래스를 토글하십시오. 사용자가 답변을 입력 한 다음 댓글로 전환하는 경우 새로 숨겨진 입력란과 관련된 입력란을 지우고 싶은 경우에는 제출시 댓글과 답변을 모두 제출할 수 있습니다.

+0

+1 내 대답 수정 –

2

부분 필드는 link_to_add_fields 도우미 메서드에 의해 데이터 특성으로 생성됩니다. 그런 다음 js는 데이터 객체를 가져 와서 렌더링합니다.

  1. 가장 쉬운 방법은 별도의 도우미 방법과 링크 '코멘트 추가'를 별도의이 '대답을 추가'하는 것, 또는
  2. 이 허용 : (이 안된하지만 좋은 가이드이어야한다) 다음 사항을 고려 사용자가 추가 할 링크를 클릭하기 전에 응답 또는 설명을 선택하고 각기 다른 부분을 다른 데이터 속성으로 갖습니다. 예 :

_form.html.erb

surveys_helper.rb

module SurveysHelper 
    def link_to_add_reply_fields(name, f, association_1, association_2) 
    object_1 = f.object.send(association_1).klass.new 
    object_1_id = object_1.object_id 
    object_1_fields = f.fields_for(association_1, object_1, child_index: object_1_id) do |builder| 
     render(association_1.to_s.singularize + "_fields", f: builder) 
    end 

    object_2 = f.object.send(association_2).klass.new 
    object_2_id = object_2.object_id 
    object_2_fields = f.fields_for(association_2, object_2, child_index: object_2_id) do |builder| 
     render(association_2.to_s.singularize + "_fields", f: builder) 
    end 

    link_to(name, '#', class: "add_reply_fields", data: {id_1: object_1_id, id_2: object_2_id, object_1_fields: object_1_fields.gsub("\n", ""), object_2_fields: object_2_fields.gsub("\n", "")}) 
    end 
end 

커피 스크립트

<select id="response_type_select_field"> 
    <option value="comment">Comment</option> 
    <option value="answer">Answer</option> 
</select> 

<%= link_to_add_reply_fields "Add Reply", f, :answers, :comments %> 

: 당신은 레일 이후 부분을 렌더링 할 수

jQuery -> 
    $('form').on 'click', '.add_reply_fields', (event) -> 
    time = new Date().getTime() 
    reply_type = $("#response_type_select_field option:selected").val() 

    if reply_type is 'answer' 
     data_attribute = 'object_1_fields' 
     regexp = new RegExp($(this).data('id_1'), 'g') 
    else if reply_type is 'comment' 
     data_attribute = 'object_2_fields' 
     regexp = new RegExp($(this).data('id_2'), 'g') 

    $(this).before($(this).data(data_attribute).replace(regexp, time)) 
    event.preventDefault()