2014-12-03 3 views
1

Я создаю вложенную форму с атрибутами из разных моделей. Я ожидаю, что все необходимые атрибуты будут действительными до того, как будет сохранен новый объект.Rails - Как проверить форму с вложенными атрибутами?

<%= form for @product do |f| %> 

    <%= f.fields_for @customer do |g| %> 

    <%= g.label :name %> 
    <%= g.text_field :name %> 

    <%= g.label :email %> 
    <%= g.text_field :email %> 

    <%= g.label :city %> 
    <%= g.text_field :city %> 

    <%= g.label :state %> 
    <%= g.text_field :state %> 

    <%= g.label :zipcode %> 
    <%= g.text_field :zipcode %> 

    <% end %> 

    <%= f.label :product %> 
    <%= f.text_field :product %> 

    <%= f.label :quantity %> 
    <%= number_field(:quantity, in 1..10) %> 

<% end %> 

Вот мои модели

class Product < ActiveRecord::Base 

    belongs_to :customer 
    validates_associated :customer 
    validates :product, :presence => "true" 

end 

class Customer < ActiveRecord::Base 

    has_one :product 
    validates :name, :email, presence: true 
    validates :email, format: { with: /[A-Za-z\d+][@][A-Za-z\d+][.][A-Za-z]{2,20}\z/ }    
    validates :city, presence: true 
    validates :zipcode, format: { with: /\A\d{5}\z/ } 

end 

Я добавил validates_associated к моей модели продукта, поэтому мой form_for @product должны требовать все валидаций клиента пройти. Это означает, что имя, адрес электронной почты, город и почтовый индекс должны быть там и должны быть отформатированы должным образом.

Я пробормотал и представил форму без заполнения поля, требуемого Клиентом, и форма считалась действительной.

Я не понимаю, где моя ошибка.

EDIT

Хорошо, так что, добавив validates :customer, атрибуты клиента в настоящее время требуется. Но они фактически не сохраняются в базе данных. Я думаю, что это связано с моим Params

def product_params 
    params.require(:product).permit(:product, :quantity) 
end 

мне нужно добавить мой клиент Params в мой список разрешенных Params ли?

ответ

2

попробовать это:

В контроллере создать экземпляр продукта и связанного с ним клиента следующим образом:

@product = Product.new 
    @customer = @product.build_customer 

используется этот код для формы

<%= form for @product do |f| %> 

    <%= f.fields_for :customer do |g| %> 

    <%= g.label :name %> 
    <%= g.text_field :name %> 

    <%= g.label :email %> 
    <%= g.text_field :email %> 

    <%= g.label :city %> 
    <%= g.text_field :city %> 

    <%= g.label :state %> 
    <%= g.text_field :state %> 

    <%= g.label :zipcode %> 
    <%= g.text_field :zipcode %> 

    <% end %> 

    <%= f.label :product %> 
    <%= f.text_field :product %> 

    <%= f.label :quantity %> 
    <%= number_field(:quantity, in 1..10) %> 

<% end %> 

я.e use: символ клиента вместо переменной экземпляра @customer.

и использовать accepts_nested_attributes_for вспомогательный метод в модели продукта, как @Charles сказал

3

Метод validates_associated только проверяет соответствующий объект, если объект существует, поэтому, если вы оставите эти поля формы пустыми, Product вы создаете/редактирование будет проверять, потому что не связанно Customer.

Вместо этого, если вы используете Rails 4+, вы хотите использовать accepts_nested_attributes_for :customer, а также validates :customer, presence: true, чтобы указать поля клиента в вашей форме продукта.

Если вы используете Rails 3, то accepts_nested_attributes_for не будет работать в ассоциации belongs_to. Вместо этого ваш класс Customer должен будет использовать accepts_nested_attributes_for :product, и вам нужно будет соответствующим образом изменить вид своей формы.

UPDATE

Кроме того, необходимо, чтобы ваши действия контроллера принимать параметры для :customer ассоциации:

def product_params 
    params.require(:product).permit(:product, :quantity, :customer_attributes => [:name, :email, :city, :state, :zipcode]) 
end 

Стоит отметить, что, поскольку нет :id поля в форме клиента полей, и нет поля :customer_id в ваших полях формы продукта, вы создадите нового клиента каждый раз, когда вы успешно представите форму продукта.

+0

ОК, я попробовал, добавив 'проверяет: customer' и теперь требуется, чтобы поле. Но когда я печатаю в поле, он говорит, что он отсутствует. Это должно быть из-за моих параметров. Я посмотрю, смогу ли я исправить это – Darkmouse

Смежные вопросы