Рельсы заполняют форму редактирования для атрибутов не столбцов - PullRequest
0 голосов
/ 20 февраля 2011

У меня есть следующая форма:

<% form_for(@account, :url => admin_accounts_path) do |f| %>
  <%= f.error_messages %>

    <%= render :partial => 'form', :locals => {:f => f} %>

    <h2>Account Details</h2>
    <% f.fields_for :customer do |customer_fields| %>
    <p>
        <%= customer_fields.label :company %><br />
        <%= customer_fields.text_field :company %>
    </p>
    <p>
        <%= customer_fields.label :first_name %><br />
        <%= customer_fields.text_field :first_name  %>
    </p>
    <p>
        <%= customer_fields.label :last_name %><br />
        <%= customer_fields.text_field :last_name  %>
    </p>
    <p>
        <%= customer_fields.label :phone %><br />
        <%= customer_fields.text_field :phone  %>
    </p>
    <% end %>

  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

а также

attr_accessor :customer

И у меня есть метод before_create для модели аккаунта, который не хранит поля customer_fields, а вместо этого использует их для отправки данных в API. Единственное, что я сохраняю, это частичная форма.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда выдается ошибка проверки, на странице отображается новое действие (ожидаемое), но ни один из атрибутов, не являющихся столбцами в форме «Сведения о счете», не будет отображаться?

Любые идеи относительно того, как я могу немного изменить этот код, чтобы заставить меня работать, ??

Это то же решение может помочь мне в форме редактирования, у меня есть получатель для данных, к которым он запрашивает API, но без размещения: value => "asdf" в каждом текстовом поле, он не ' Заполните поля либо ..

1 Ответ

2 голосов
/ 20 февраля 2011

Хорошо, вам нужно создать класс для работы с вашим клиентом с шлюзом Braintree и без него. Сначала создайте класс:

class Customer
  attr_accessor :company, :first_name, :last_name, :phone, :gateway

  def initialize gateway_id=nil
    begin
      @gateway = Braintree::Customer.find(gateway_id) unless gateway_id.nil?
    rescue Braintree::NotFoundError
    end
  end

  def company
    @gateway.nil? ? @company : @gateway.company
  end

  # Implement the rest of the methods this way as well. You can even use
  # meta-programming so that you don't repeat yourself.
end

Вы заметите, что вызов Customer.new (id) .company будет работать с идентификатором или шлюзом и без него, потому что если будет возвращен несуществующий @company шлюз и если будет присутствовать шлюз, компания шлюза будет быть возвращенным.

Наконец, подключите это к вашей модели:

class Account
  def customer
    @customer ||= Customer.new(self.gateway_customer_id)
  end

  def customer= h
    @customer = Customer.new
    @customer.company = h[:company]
    ...
    @customer
  end
end

Вам придется изменить способ записи кода в API, чтобы, например, использовать customer.company вместо customer [: company], но, вероятно, вы можете написать функцию в классе Customer, чтобы сделать это легко.

Вы должны будете изменить свою форму на:

<% f.fields_for :customer, @account.customer do |customer_fields| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...