2015-10-13 4 views
0

У меня есть пользователь и пользователь с одним адресом. Мне нужно создать форму, похожую на страницу редактирования профиля. Это позволит сэкономить несколько полей пользователя и сохранить адрес пользователя. Но каждый раз, когда я отправляю форму, данные пользователя правильно сохраняются в БД, но для адреса каждый раз создается новая запись с правильным значением user_id, а другое значение поля равно null.Rails 4 - сохранить/обновить вложенную запись

Вопрос: Как сохранить адрес в базе данных?

class User < ActiveRecord::Base 
    has_one :address 
    accepts_nested_attributes_for :address 
end 

class Address < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :country 
    attr_accessor :city, :zip_code, :street_address, :state 
end 

Форма

<%= form_for @user, url: {controller: :profiles, action: :update} do |f| %> 
<%= f.text_field :first_name, autofocus: true, :placeholder => 'First Name' %> 
<%= f.text_field :last_name, :placeholder => 'Last Name' %> 

<%= f.fields_for :address do |address_fields| %> 
    <%= address_fields.select :country_id, options_for_select(["Select One", "Cell", "Work", "Office", "Home", "Other"],:disabled => ["Select One"]) %> 
    <%= address_fields.select :state, options_for_select(["Select One", "Cell", "Work", "Office", "Home", "Other"],:disabled => ["Select One"]) %> 
    <%= address_fields.text_field :city, :placeholder => 'City' %> 
    <%= address_fields.text_area :street_address, :placeholder => 'Street Address' %> 
    <%= address_fields.text_field :zip_code, :placeholder => 'Zip Code' %> 
<% end %> 

<%= f.submit "Update", :class => 'btn btn-primary' %> 

контроллер

class ProfilesController < ApplicationController 
    def edit 
     @user = current_user 
     @user.build_address if @user.address.nil? 
    end 

    def update 
     @user = current_user 
     respond_to do |format| 
     if @user.update(user_params) 
      format.html { redirect_to welcome_url, notice: 'Your Profile was successfully updated.' } 
      format.json { render :show, status: :ok, location: @user } 
     else 
      format.html { render :edit } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
end 

private 

    def set_user 
     @user = User.find(params[:id]) 
    end 

    def user_params 
     params.require(:user).permit(:first_name, :last_name, :email, :phone_number, :date_of_birth, address_attributes: [ :id, :city, :country_id, :zip_code, :street_address, :state]) 
    end 

end 

ответ

0

Ваш country_id поле выбора возвращает строку, в то время как ваша модель Адрес, вероятно, ожидает целое. Это может помешать сохранению записи правильно?

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