I’ve got User has_one Shop. Rails is not validating when I tried
create_shop or build_shop, neither in the browser nor the rails console.
My code:
class Shop < ActiveRecord::Base
attr_protected :user_id
belongs_to :user
validates_presence_of :name, :primary_address, :city, :country_code,
:currency
end
class ShopsController < ApplicationController
before_filter :signed_in_user, except: [:index, :show]
before_filter :correct_user, only: [:edit, :update, :currency,
:update_currency]
def new
@shop = Shop.new
end
def create
@shop = current_user.build_shop(params[:shop])
if @shop.save
flash[:success] = "Successfully added a shop."
redirect_to user_path(current_user)
else
render 'new'
end
end
…
end
Error log (when tried in browser):
Started POST “/shops” for 127.0.0.1 at 2012-08-17 04:01:22 +0800
Processing by ShopsController#create as HTML
Parameters: {“utf8”=>“✓”,
“authenticity_token”=>“bA+KBkV1CQTyb3H8lH2dGyOl6YR+Lp2I9jQodxDjXlE=”,
“shop”=>{“name”=>"", “primary_address”=>"", “secondary_address”=>"",
“city”=>"", “postal_code”=>"", “country_code”=>"", “phone”=>"",
“email”=>"", “website”=>"", “facebook”=>"", “twitter”=>"",
“opening_hours”=>"", “description”=>"", “latitude”=>"", “longitude”=>"",
“currency”=>“AED”}, “commit”=>“Add shop”}
User Load (0.4ms) SELECT “users”.* FROM “users” WHERE
“users”.“remember_token” = ‘YykvzJ8PCZ5RFeE_ZomLXg’ LIMIT 1
Shop Load (0.4ms) SELECT “shops”.* FROM “shops” WHERE “shops”.“user_id”
= 1 LIMIT 1
(0.1ms) BEGIN
(0.1ms) COMMIT
(0.1ms) BEGIN
(0.1ms) ROLLBACK
In rails console:
irb(main):001:0> alice = User.find(1)
irb(main):002:0> alice.build_shop(name: “Alice Shop”)
Shop Load (0.6ms) SELECT “shops”.* FROM “shops” WHERE
“shops”.“user_id” = 1 LIMIT 1
(0.1ms) BEGIN
(0.1ms) COMMIT
=> #<Shop id: nil, user_id: 1, name: “Alice Shop”, primary_address: nil,
secondary_address: nil, city: nil, postal_code: nil, state_code: nil,
country_code: nil, phone: nil, email: nil, website: nil, facebook: nil,
twitter: nil, opening_hours: nil, description: nil, latitude: nil,
longitude: nil, logo: nil, currency: nil, created_at: nil, updated_at:
nil>
The weird thing is it does validate in the edit form using
update_attributes. But not when a User creates a new Shop.