2016-12-08 5 views
0

Wicked gem을 사용하여 다단계 양식을 작성하려면 this tutorial을 따르고 있습니다. 각 사용자는 하나의 답변 (일련의 질문에 대한 답변을 저장하는 모델)을 가지고 있으며, 사용자가 답변하고 답변에 저장 한 질문을 단계별로 안내하는 QuestionnaireController가 있습니다. 지금까지 단 두 단계 만있었습니다. 각각 하나의 질문 (답변 테이블의 부울 열)이 있습니다.Rails Wicked multi step form - param이 없거나 값이 비어 있습니다. 허용되지 않는 매개 변수와 일치하지 않습니다.

PARAM가 없거나 값이 비어 : 내가 단계별와 답변을 할 때마다 내가 값을 사용하지 않고 내가받을 제출하지만 때, 모든 것이 완벽하게 작동라는 질문에 대한 답

내 코드 ...

answer.rb :

class Answer < ApplicationRecord 
    belongs_to :user 

    cattr_accessor :questionnaire_steps do 
    %w(step_one step_two) 
    end 

    attr_accessor :current_step #stores the current questionnaire step 

    validates :user_id, presence: true 

    with_options if: -> { required_for_step?(:step_one) } do |step| 
    step.validates :question_one, inclusion: [true, false] 
    end 
    with_options if: -> { required_for_step?(:step_two) } do |step| 
    step.validates :question_two, inclusion: [true, false] 
    end 

    def required_for_step?(step) 
    # All fields are required if no questionnaire step is present 
    return true if current_step.nil? 
    # All fields from previous steps are required if the 
    # step parameter appears before or we are on the current step 
    return true if self.questionnaire_steps.index(step.to_s) <= self.questionnaire_steps.index(current_step) 
    end 
end 

answers_controller.rb :

,536,913 63,210
class AnswersController < ApplicationController 
    before_action :setup 

    def setup 
    @user = current_user 
    end 

    def show 
    @answer = @user.answer 
    end 

    def new 
    @answer = Answer.new 
    @answer = @user.build_answer 
    @answer.save(validate: false) 
    end 

    def create 
    @answer = @user.answer 
    redirect_to questionnaire_path(@answer, Answer.questionnaire_steps.first) 
    end 
end 

questionnaire_controller.rb :

class QuestionnaireController < ApplicationController 
    include Wicked::Wizard 

    before_action :setup 

    steps *Answer.questionnaire_steps 

    def setup 
    @user = current_user 
    end 

    def show 
    @answer = @user.answer 
    render_wizard 
    end 

    def update 
    @answer = @user.answer 
    @answer.update_attributes(answer_params(step)) 
    render_wizard @answer 
    end 

    private 

    def answer_params(step) 
    permitted_attributes = case step 
     when "step_one" 
     [:question_one] 
     when "step_two" 
     [:question_two] 
    end 

    params.require(:answer).permit(permitted_attributes).merge(current_step: step) 
    end 
end 

step_one.html.erb :

<div id="questionnaire" class="container-fluid well inline-headers"> 
    <%= form_for @answer, method: :put, url: wizard_path do |f| %> 
    <div class="row"> 
    <% if f.object.errors.any? %> 
     <div id="error_explanation" class="alert alert-dismissible alert-danger" > 
     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> 
     <ul> 
      <% f.object.errors.each do |attribute, message| %> 
      <%= content_tag :li, f.object.errors.full_message(attribute, message), :id => "error_#{attribute}" %> 
      <% end %> 
     <ul> 
     </div> 
    <% end %> 
    </div> 
    <div class="row"> 
    <div class="col-md-8 form-group"> 
     <p>Are you any good at this?</p> 
    </div> 
    <div class="col-md-4 form-group"> 
     <%= label_tag(:question_one, "Yes") %> 
     <%= f.radio_button :question_one, true %> 
     <%= label_tag(:question_one, "No") %> 
     <%= f.radio_button :question_one, false %> 
    </div> 
    </div> 
    <div class="row"> 
    <div class="col-md-4 col-md-offset-8 form-group"> 
     <p><%= f.submit "Save & Continue", class: "btn btn-warning" %></p> 
    </div> 
    </div> 
    <% end %> 
</div> 

routes.rb (인정 하듯이 내가 ID를 마스크 수치를 무료로 느낌이 귀여운 얻기 위해 노력 나를 올바른 방법으로 이끄는 것) :

resources :answers, only: [:show, :new, :create] 
    get 'user/questionnaire', to: 'answers#show' 
    get 'user/questionnaire/new', to: 'answers#new' 
    post 'user/questionnaire/new', to: 'answers#create' 

resources :questionnaire 

옵션을 선택하여 제출하면 데이터에 저장됩니다. 기본 및 다음 단계로 리디렉션하지만 옵션을 선택하지 않고 제출하면 유효성 검사 오류가 발생할 것으로 예상되면 param에 오류가 누락됩니다.

HTML 매개 변수로 QuestionnaireController 번호 업데이트에 의해 처리 : { "UTF8"=> "" "authenticity_token"=> "J45sG/YIqTaBECgBqNLr9Ys3rJewDK78d/cKHWFHYEIzAaOiTXhgH6evPZKl5LhnSAMnQnA94CXonqriyj0fCQ ==", 서버 로그에서 나에게 내가 기대 된 유효성 검사 오류를 얻을 수있는

내가 params.require(:answer).permit(permitted_attributes).merge(current_step: step)에서 require(:answer)을 제거 포함, 잠재적 인 수정의 숫자를 시도했다 => "이 & 계속 저장"을 "ID"=> "step_one을"} "커밋" 유효한 값을 저장하는 것을 허용하지 않습니다. 2016년 12월 8일 23시 26분 14초 0545 처리에 : 1 "/ 질문/step_one을"PUT 시작

:이 시나리오에서 나는 여전히 서버 로그에 다음과 유효성 검사 오류 { "UTF8"=> "" "authenticity_token"=> "RWAHfu0BE82ik6gTChh3nmtuyOUa5j0qiz4H03ejIkRR78jHVnHa5IQsvYAHLiQMqFpDMNrXc/MUV6cs3NldDw ==", "답"=> { "question_one"=> "사실 : HTML
매개 변수로 QuestionnaireController 번호 업데이트로 ","commit "=>"Save & 계속 ", "id "=>"step_one "} ... SQL ... 허용되지 않는 매개 변수 : utf8, _method, authenticity_token, answer, commit, id

신참을 도와 주셔서 미리 감사드립니다.

업데이트 : 튜토리얼 (중첩 된)과 일치하도록 경로를 수정했는데,이 경로가 무언가와 관련이 있다고 생각하여 (즉, 응답 ID가 아닐 수도 있음) 생각했지만 여전히 매개 변수가 누락되었습니다. 오류가 발생했습니다.

resources :answers, only: [:show, :new, :create] do 
    resources :questionnaire, only: [:show, :update], controller: 'questionnaire' 
    end 
    get 'user/questionnaire', to: 'answers#show' 
    get 'user/questionnaire/new', to: 'answers#new' 
    post 'user/questionnaire/new', to: 'answers#create' 

나는 또한과 같이 제출하기 전에 hidden_field_tag을 추가하는 시도 :

<%= hidden_field_tag(:answer, @answer) %> 

을하지만 내가 얻을 :

정의되지 않은 메서드`허가를 '#

에 대한

아마도 hidden_field_tag가 @ answer.attributes를 문자열로 전달하기 때문에 아마도 강한 파 ameter 선언에는 해시가 필요합니다. 서버에서 :

이 HTML 매개 변수로 QuestionnaireController 번호 업데이트 에 의해 2016년 12월 12일 13시 25분 19초 0545 처리에 : 1 "/ 답/46/설문/step_one을"PUT 시작 : { "UTF8"= "" " "authenticity_token "=>"wlLpKoMvqgyfwB5gyP/qubR4ZpZa6jm9KHeMuiwJTc6IOJZi9PgiSegvF OzlN09ctEuxuxiAuRs + +/B2InRGhA == " "답변 "=" "{\"아이디 \ "=> 46 \"USER_ID \ "question_one \"=> nil, \ "question_two \"=> nil, \ "percentage_complete \"=> #, \ "완료 \"=> false, \ "created_at \" => 2016 년 12 월 12 일 02:12:31 EST -05 : 00, \ "updated_at \"=> 2016 년 12 월 12 일 02:12:31 EST -05 : 00} ","commit "=> 구하다 & 계속 하시겠습니까? ","answer_id "=>"46 ","id "=>"step_one "}

도와주세요!

답변

0

params.requireparams.fetch으로 변경했는데 제대로 작동합니다 (유효성 검사가 적절하게 트리거되고 올바른 값을 포함한 단계를 성공적으로 수행 할 수 있음).

0

질문이 유효합니까?

나는 이것을 주석에 넣고 싶지만 그렇게 할 수는 없다. 문제는 vaildations에 있다고 생각합니다. 존중하는 필드에 값을 입력하고 그렇지 않을 때 오류를 던지는 지 확인합니다. 모델에서 step.validates를 제거하면 어떻게됩니까?

+0

여전히 유효하며 문제를 해결했다고 생각합니다. 나는'params.require'를'params.fetch'로 변경했기 때문에 유효성 검사가 필요합니다. (유효성 검증이 적절히 트리거되고 유효한 값을 가진 단계를 성공적으로 수행 할 수 있습니다) 작동하는 것처럼 보입니다. – CChandler81