2011-01-25 3 views
1

Я нахожусь на Rails 3. У меня есть модель под названием Client, которая имеет name, phone и email. Мой файл модели выглядит следующим образом:Валидация всегда терпит неудачу во всех полях

class Client < ActiveRecord::Base 
    belongs_to :salon 
    belongs_to :address 
    validates_presence_of :name 
    validates_presence_of :phone 
    validates_presence_of :email 
    accepts_nested_attributes_for :address 
    attr_accessible :address_attributes 
end 

Как вы можете видеть, name, phone и email все требуется. Когда я перехожу в форму, где я должен создать новый Client и отправить его, все три проверки не удаются, независимо от того, что я помещаю в поля. Вот мой файл формы:

<%= form_for(@client) do |f| %> 
    <% if @client.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@client.errors.count, "error") %> prohibited this client from being saved:</h2> 

     <ul> 
     <% @client.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <%= f.hidden_field :salon_id, :value => Salon.logged_in_salon.id %> 
    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :phone %><br /> 
    <%= f.text_field :phone %> 
    </div> 
    <div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.text_field :email %> 
    </div> 

    <%= f.fields_for :address do |address_form| %> 
    <div class="field"> 
     <%= address_form.label :line1 %><br /> 
     <%= address_form.text_field :line1 %> 
    </div> 
    <div class="field"> 
     <%= address_form.label :line2 %><br /> 
     <%= address_form.text_field :line2 %> 
    </div> 
    <div class="field"> 
     <%= address_form.label :city %><br /> 
     <%= address_form.text_field :city %> 
    </div> 
    <div class="field"> 
     <%= address_form.label :state_id %><br /> 
     <%= select("client[address]", "state_id", State.all.collect {|s| [ s.name, s.id ] }) %> 
    </div> 
    <div class="field"> 
     <%= address_form.label :zip %><br /> 
     <%= address_form.text_field :zip %> 
    </div> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Вот мое create действие:

def create 
    @client = Client.new(params[:client]) 

    respond_to do |format| 
     if @client.save 
     format.html { redirect_to(@client, :notice => 'Client was successfully created.') } 
     format.xml { render :xml => @client, :status => :created, :location => @client } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @client.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Любая идея, почему это происходит?

+0

Можете ли вы включить свое действие для создания. Кроме того, выводится ли вложенная часть вашей формы? – mark

+0

Отредактировано, чтобы включить действие create. Нет, вложенная часть не выводит, и я не знаю, почему. Я бы это хотел, но я решил еще не решить эту отдельную проблему. –

+0

Вам нужно указать экземпляр адреса или построить один встроенный: <% = f.fields_for @address do | address_form | %> или <% = f.fields_for @ client.build_address do | address_form | %> – mark

ответ

2

Это потому, что вы установили :address_attributes как единственный доступный атрибут. Изменение

attr_accessible :address_attributes 

в

attr_accessible :address_attributes, :name, :phone, :email 

или не используют массовое назначение.

+0

Я попробую. Что именно вы подразумеваете под массовым заданием? –

+0

http://guides.rubyonrails.org/security.html#mass-assignment –

+0

Это, кстати, поставило проблему. Благодарю. –

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