2014-06-07 4 views
5

레일즈 4 애플리케이션에서 Simple_form을 사용합니다.모델이없는 Simple_form을 사용하여 유효성 검사 오류 메시지를 표시하는 방법은 무엇입니까?

모델에 연결되지 않은 뷰에 오류 메시지를 표시하려면 어떻게합니까?

모델을 기반으로 한 다른보기와 같은 결과를 원합니다.

<%= simple_form_for(:registration, html: { role: 'form' }, :url => registrations_path) do |f| %> 

    <%= f.error_notification %> 

    <%= f.input :name, :required => true, :autofocus => true %> 
    <%= f.input :email, :required => true %> 
    <%= f.input :password, :required => true %> 
    <%= f.input :password_confirmation, :required => true %> 

    <%= f.button :submit %> 

<% end %> 

는 '정상'관점에서 (즉, 모델) 회선 <%= f.error_notification %> 디스플레이 오류 : 지금

이 뷰의 코드이다.

오류를 표시하기 위해 Simple_form에서 사용한 것을 초기화하려면 컨트롤러에서 무엇을해야합니까?

감사

답변

0

simple_form_for 도우미 모델을 포장해야합니다. 그러나 이것이 우리가 말한 바로는 데이터베이스 테이블에 의해 뒷받침되는 ActiveRecord 모델이어야한다는 것을 의미하지는 않습니다. 데이터베이스로 지원되지 않는 모델을 자유롭게 만들 수 있습니다. Rails 3+에서 이것을 수행하는 방법은 클래스에 ActiveModel에서 필요한 구성 요소를 포함시키는 것입니다. This SO post은 예를 들어이를 수행하는 방법을 설명합니다 (그리고 많은 다른 사람들이있을 것이라고 확신합니다). ActiveModel::Validation 모델을 포함하면 errors 컬렉션에 추가 할 수 있으며 f.error_notification 문은 테이블 지원 모델에서 사용했던 것처럼 오류를 출력합니다.

TL : DR : 테이블 기반이 아닌 모델이 아닌 일반 Active 모델을 일반 Old 모델처럼 처리하면 양식에서 올바른 작업을 수행해야합니다.

+0

답변 해 주셔서 감사합니다. 모델없이 Simple_form을 사용할 수 있습니다. 첫 번째 인수로''''symbol'''''을 사용하기 만하면됩니다. 실제로 컨트롤러/뷰가 잘 작동하고 모델을 기반으로 한 뷰로 오류 메시지 (컨트롤러에서 생성)를 표시하려고합니다. 어쨌든, 당신의 아이디어를 주셔서 감사합니다, 나는이 솔루션을 보일 것입니다. –

+0

아, 잘 알고 있습니다. 그 단순한 사실에 대해 깨닫지 못했습니다. 그래도'error_notification' 도우미는 래핑 된 객체에 대해'errors' 메소드를 찾고있을 가능성이 높습니다. 그것은 상징이 이것에 반응하지 않을 것이라는 것을 이해합니다. 폼에'errors'에 응답하는'Struct' 오브젝트를 감쌀 수 있을지 궁금합니다. 아마도,하지만 여전히 데이터베이스가 아닌 모델이 나에게 더 좋을 것 같습니다. – pdobb

0

사용 client_side_validations 보석, 그것은 간단하고, 당신은 할했습니다 -

<%= simple_form_for(:registration, html: { role: 'form' }, :url => registrations_path) , :validate => true do |f| %> 

그러나 당신은 또한 모델에서 유효성 검사를 추가해야합니다.

+0

감사합니다. 나는 이것을 시험 할 것이다. 하지만 모델이 없습니다. 컨트롤러와 뷰만. –

5

Simple Form은이 기능을 "기본 제공되지 않음"으로 지원하지 않습니다. 그러나이 같은 초기화에서 "원숭이 패치"를 추가 할 수 있습니다 (면책 조항 -이 내 간단한 테스트 케이스를 위해 작동하는 것처럼 보이지만 철저하게 테스트되지 않았습니다) :

// Put this code in an initializer, perhaps at the top of initializers/simple_form.rb 
module SimpleForm 
    module Components 
    module Errors 
     def has_errors? 
     has_custom_error? || (object && object.respond_to?(:errors) && errors.present?) 
     end 

     def errors 
     @errors ||= has_custom_error? ? [options[:error]] : (errors_on_attribute + errors_on_association).compact 
     end 
    end 
    end 
end 

module SimpleForm 
    class ErrorNotification 
    def has_errors? 
     @options[:errors] || (object && object.respond_to?(:errors) && errors.present?) 
    end 
    end 
end 

을 그리고 당신은 오류를 추가 할 수 있습니다 귀하의 양식은 다음과 같습니다 ('오류 : 참'으로 설정하여 오류 알림을 표시할지 여부를 명시하십시오. 오류가 있는지를 결정하기 위해 자체 검사를 수행하고 오류를 동적으로 추가해야합니다).

=simple_form_for :your_symbol do |f| 
    =f.error_notification errors: true 
    =f.input :item1, as: :string, error: "This is an error on item1" 
    =f.input :item2, as: :string, error: "This is an error on item2" 
관련 문제