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,210class 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">×</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 "}
도와주세요!
여전히 유효하며 문제를 해결했다고 생각합니다. 나는'params.require'를'params.fetch'로 변경했기 때문에 유효성 검사가 필요합니다. (유효성 검증이 적절히 트리거되고 유효한 값을 가진 단계를 성공적으로 수행 할 수 있습니다) 작동하는 것처럼 보입니다. – CChandler81