2013-11-24 3 views
0

내 Rails 앱에서 단계 및 질문이 있습니다. 사용자는 모든 단계에 대해 질문을 생성 할 수 있습니다. Step.rb중첩 된 폼 모델 - 실행 조건 액션

class Step < ActiveRecord::Base 
    has_one :question, :dependent => :destroy 
    accepts_nested_attributes_for :question, :allow_destroy => :true 
end 

Question.rb

class Question < ActiveRecord::Base 
    belongs_to :step 
end 

내가 질문 생성하는 중첩 된 양식을 사용 :

<%= semantic_form_for [@project,@step] do |f| %> 
    <%= f.fields_for :question do |question_f| %> 
     <%= question_f.text_area :description %> 
    <% end %> 
    <% end %> 

먼저, I 사용자가 실제로 질문 텍스트 영역에 텍스트를 입력하는 경우에만 새로운 질문을 만들고 싶습니다. 단계 양식에서 빈 질문을 자동으로 저장하지 못하게하려면 어떻게합니까?가 여기 내 현재 단계 컨트롤러 :

class StepsController < ApplicationController 
     def new 
     @step = @project.steps.build(:parent_id=> params[:parent_id]) 
     @step.build_question 
     ... 
     end 

     def create 
     @step = @project.steps.build(params[:step]) 
     respond_to do |format| 
      if @step.save 
      ... 
     end 
    end 

둘째, 나는 새로운 질문을 만들 때 일부 루비 코드를 실행합니다. 특히, 질문이 포함 된 프로젝트의 updated_at 날짜를 업데이트하고 싶습니다. 이걸 내 컨트롤러에 넣을까요? 질문 모델에 대한 컨트롤러를 만들고 만들기 및 새 메서드를 만들려고했지만 단계 폼을 제출할 때 호출되지 않았습니다.

답변

2

Step 클래스의 중첩 된 속성 행을 수정하여 속성이 모두 공백 인 경우 제출 된 질문을 거부 할 수 있습니다. 아래의 accepts_nested_attributes_for 설명서를 참조하십시오 : reject_if.

두 번째 문제는 여러 가지 방법으로 해결할 수 있습니다. 항상 질문이 추가 될 때마다 updated_at 프로젝트를 업데이트 ("터치"라고도 함)하려는 경우 프로젝트에 닿는 Question 클래스에 콜백을 추가 할 수 있습니다. See this guide on callbacks.

한편
class Question < ActiveRecord::Base 
    belongs_to :step 
    has_one :project, :through => :step 

    after_create :touch_project 

    private 

    def touch_project 
    project.touch 
    end 
end 

, 당신은 단지 특정 컨트롤러 액션의 맥락에서 질문의 프로젝트를 터치합니다, 당신은 질문이 만들어 졌는지 여부를 확인할 수 있습니다 그렇다면 프로젝트를 터치합니다

def create 
    @step = @project.steps.build(params[:step]) 
    if @step.save 
    if @step.question.present? 
     @project.touch 
    end 
    # do other stuff for successful save 
    else 
    # handle failed save 
    end 
end 

나중에 참조 할 두 가지 크게 관련이없는 질문이있는 경우 별도로 질문하는 것이 좋습니다. 질문을 결합하면 같은 문제가있는 다른 사람들이 답을 찾기가 더 어려워집니다.

+0

이것은 완벽합니다. 감사합니다. 나는 reject_if에 대해 결코 알지 못했고, 확실히 내 애플 리케이션의 다른 영역에서 그것을 사용합니다. – scientiffic