2010-02-02 9 views
2

레일스에 익숙하지 않아 커스텀 폼 요소를 추가하는 표준 방법이 무엇인지 알아 내려고합니다. 현재 내가하고있는 방식은 슈퍼 grotty입니다.레일에있는 사용자 정의 폼 요소

module ActionView 
    module Helpers 
    module FormOptionsHelper 
     def some_new_field(object, method, options = {}, html_options = {}) 
      #code code 
     end 
    end 
    class FormBuilder 
     def contract_year_select(method, options = {}, html_options = {}) 
     @template.some_new_field(@object_name, method, objectify_options(options), @default_options.merge(html_options)) 
     end 
    end 
    end 
end 

그러나 나는 이것을 보았습니다. FormBuilder 확장

(here에서)

class Forms::ApplicationFormBuilder < ActionView::Helpers::FormBuilder 
    Forms::ApplicationHelper.instance_methods.each do |selector| 
    src = <<-end_src 
     def #{selector}(method, options = {}) 
     @template.send(#{selector.inspect}, @object_name, method, objectify_options(options)) 
     end 
    end_src 
    class_eval src, __FILE__, __LINE__ 
    end 

    private 

    def objectify_options(options) 
    @default_options.merge(options.merge(:object => @object)) 
    end 
end 

는 펀칭 오리보다 더 나은 솔루션처럼 보인다. FormBuilder 클래스의 일부를 내 사용자 정의 파일에 직접 복사 할 필요가없는 다른 방법이 있습니까? 여기

+1

처음으로 나는 오리 펀치라는 용어를 보았습니다. 나는 그것을 사랑한다! –

+3

패트릭 유잉 (Patrick Ewing)의 인용문에서 비롯된 것 "글쎄, 나는 아담에게 완전히 팔렸다. 마치 오리처럼 걷고 오리처럼 말하면 오리 일 뿐이라는 생각이 들었다. 그렇다면이 오리가 너에게 당신이 원하는 소음, 당신은 당신이 기대하는 것을 돌려 줄 때까지 오리를 펀치해야합니다. " – baudtack

답변

0

두 파트너 사 :

먼저, 레일 새로운 사람으로, 내가 Formtastic 보석을 사용하는 것이 좋습니다 것입니다. V는 레일에있는 MVC의 남용되고 방치 된 부분입니다.

Formtastic 아주 잘 테스트 당신이 그때는 화려한 클래스의 확장 사용자 지정 요소를 작성하고 간단한 필드 표시를 넘어 다른 혜택의 전체 호스트를 얻을 수 있습니다 Formtastic으로 레일 3

https://github.com/justinfrench/formtastic

에 대한 지원을하고있다.

두 번째, 클래스를 확장하는 것은 확실히 허용됩니다. 살펴보기가 더 쉽기 때문에 Module 메서드를 선호합니다. 의 라인을 따라 뭔가처럼 :

module Forms::ApplicationFormBuilder 
class WhateverYourExtending 
    def some_special_method(stuff) 
    # all kinds of special stuff here 
    end 
end 
end 

하지만 거의 내가 여기에 대해 이야기하고 알고 ...이 물건은 바로 내 이해의 가장자리에있다.

그냥 형식에 대해 이야기하고있는 것을보고 저는 Formtastic을 좋아합니다!

관련 문제