рельсы простые поля формы, не связанные с моделью



У меня есть существующая форма, которая привязана к модели с именем "заказ", но я хочу добавить новые поля формы, которые будут захватывать данные кредитной карты, такие как имя, номер cc и т. д., которые будут обрабатываться на стороннем платежном шлюзе.



но поскольку я не хочу сохранять информацию CC в нашей базе данных, в моей таблице заказов нет соответствующих столбцов. И это дает мне ошибку при отправке формы, что эти поля ввода кредитной карты не являются "частью" модели заказа.

519   5  

5 ответов:

Вы можете использовать attr_accessor

 class Order < ActiveRecord::Base

   attr_accessor :card_number


 end

теперь вы можете сделать Order.first.card_number = '54421542122' или использовать его в своей форме или что-то еще вам нужно сделать.

смотрите здесь для ruby docs http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor а вот для полезного stackoverflow вопрос что такое attr_accessor в Ruby?

Не перепутайте его с attr_accessible! разница между attr_accessor и attr_accessible

Если я правильно понял ваш ответ, то что вы хотите сделать, объясняется на официальной странице wiki здесь:создать поддельный вход, который не читает атрибуты. Вы можете использовать поле, не связанное с каким-либо реальным столбцом базы данных по предложению Эдварда, однако вам не нужно определять атрибут в вашей модели, если поле формы не имеет ничего общего с моделью.

таким образом, трюк, описанный на странице, определяет пользовательский ввод под названием "FakeInput" и использует его как это:

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

не забудьте перезагрузить сервер rails после добавления / изменения пользовательского ввода в качестве комментария монтажника.

обновление: обратите внимание:официальная страница Вики обновилась и пример кода на вики-странице не работает для тех, кто использует более старые версии 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. Вы можете передать любую строку/символ пока нет модели с таким же названием.

т. е. к сожалению, я не могу пройти :user, поскольку simple_form попытается создать экземпляр пользовательской модели, и мы снова получим то же сообщение об ошибке...

также, если вы просто пытаетесь что-то добавить и получить его в 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 -%>

Я нашел очень простой (и несколько странный) изменение.

просто добавить С value ключ внутри. Например:

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

протестированы версии simple_from: 3.2.1, 3.5.1

Comments

    Ничего не найдено.