ProgramingTip

모델과 관련이없는 rails simple_form 필드

bestdevel 2020. 10. 29. 08:24
반응형

모델과 관련이없는 rails simple_form 필드


'주문'이라는 이름, 참조 번호 제출 같은 신용 카드 정보를 구축하여 결제 게이트웨이 처리 할 새 양식 필드를 추가하고 싶습니다.

그러나 CC 정보를 데이터베이스에 저장하고 싶지 않기 때문에 주문 테이블에 해당 열이 없습니다. 그리고 신용 카드 입력 필드가 주문 모델의 '일부'가 아니라 양식을 생성 할 때 오류가 발생합니다.


attr_accessor를 사용할 수 있습니다.

 class Order < ActiveRecord::Base

   attr_accessor :card_number


 end

이제 Order.first.card_number = '54421542122'양식이나 필요한 다른 작업을 수행 하거나 사용할 수 있습니다 .

루비 문서 http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor 및 유용한 스택 오버플로 질문 여기 루비에서 attr_accessor 란 무엇입니까?

attr_accessible과 혼동하지 않습니다! attr_accessor와 attr_accessible의 차이점


내가 당신의 대답을 정확하게 이해한다면, 당신이 설명하고 싶은 것은 여기의 공식적인 위키 페이지에 존재합니다 : 속성을 읽지 않는 가짜 입력을 만드세요 . Edward의 제안에 따라 실제 데이터베이스 열과 관련이없는 필드를 사용할 수있는 양식 필드가 모델과 관련이없는 경우 모델에 속성을 정의 할 필요가 없습니다.

요약하면 페이지에서 설명하는 트릭은 'FakeInput'이라는 사용자 정의 입력을 정의하고 다음과 같이 사용하는 것입니다.

<%= simple_form_for @user do |f| %>
  <%= f.input :agreement, as: :fake %>
  ....

Fitter Man이 언급 한대로 사용자 정의 후에는 Rails 서버를 다시 시작하는 것을 잊지 마세요.

UPDATE : 것을 제발 참고 공식 위키 페이지가 업데이트 된 위키 페이지의 샘플 코드는 SimpleForm의 이전 버전을 사용하는 사람들을 위해 작동하지 않습니다 . 와 같은 오류가 발생하면 대신 아래 코드를 사용하십시오 undefined method merge_wrapper_options for.... 3.0.1을 사용하고있는 코드는 잘 작동합니다.

class FakeInput < SimpleForm::Inputs::StringInput
  # This method only create a basic input without reading any value from object
  def input
    template.text_field_tag(attribute_name, input_options.delete(:value), input_html_options)
  end
end

이를 처리하는 가장 좋은 방법은 simple_fields_for다음과 같이 사용하는 것입니다.

<%= simple_form_for @user do |f| %>
  <%= f.input :first_name %>
  <%= f.input :last_name %>
  <%= f.input :email %>

  <%= simple_fields_for :other do |o| %>
    <%= o.input :change_password, as: :boolean, label: 'I want to change my password' %>
  <% end %>
<% end %>

이 예에서는 change_password기본 user모델의 일부 가 아닌 새 필드를 추가했습니다 .

이것이 좋은 접근 방식 인 이유는 간단한 양식 입력 / 래퍼를 사용할 수 있기 때문입니다. @baxang의 답변은 다른 유형의 입력을 사용할 수 없기 때문에 신경 쓰지 언어입니다. 이것은 더 유연 해입니다.

작업을 수행이하려면로 전달해야 우리 :other했습니다 simple_fields_for. 동일한 이름을 가진 모델이없는 모든 페이지 / 기호 사용할 수 있습니다 .

불행히도 :usersimple_form이 사용을 인스턴스화하려고 모델 시도하고 동일한 오류 메시지가 다시-display되므로 전달할 수 없습니다 .


추가 작업을 추가하고 가져 params오려고하지만 모델의 해시 제외하면 FormTagHelpers를 수행 할 수 있습니다. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

예 :

    <%= simple_form_for resource, :as => resource_name, :url =>   invitation_path(resource_name), :html => {:method => :post} do |f| %>
       <%= devise_error_messages! %>

    <% resource.class.invite_key_fields.each do |field| -%>
       <%= f.input field %>
       <%= hidden_field_tag :object_name, @object.class.name %>
       <%= hidden_field_tag :object_id, @object.id %>
    <% end -%>

매우 간단하고 다소 이상한 해결 방법을 찾았습니다.

안에 input_html아무 value키나 옵션을 추가하기 만하면 됩니다. 예 :

= simple_form_for @user do |f|
  = f.input :whatever, input_html: {value: ''}

테스트 된 simple_from 버전 : 3.2.1, 3.5.1

참고 URL : https://stackoverflow.com/questions/12146466/rails-simple-form-fields-not-related-to-the-model

반응형