Rails doesn't validate create_model or build_model (has_one association)

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.

On 17 August 2012 01:30, network DB [email protected] wrote:

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.

Those methods create the object but do not save it (see section
4.1.1.3 in the Rails Guide on Associations). Validation happens when
the record is saved (or valid? is called).

Colin

Colin L. wrote in post #1072628:

On 17 August 2012 01:30, network DB [email protected] wrote:

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.

Those methods create the object but do not save it (see section
4.1.1.3 in the Rails Guide on Associations). Validation happens when
the record is saved (or valid? is called).

Colin

Yeah but in the browser, it just went straight to the show action
without showing any validation warning at all. If it fails validation,
it should render the shops#new action again.

Here’s the error message it gives me when I click submit in the
shops#new form without inputting anything and then it tried to go to the
show action:

Routing Error

No route matches {:action=>“show”, :controller=>“shops”, :id=>#<Shop id:
nil, user_id: 1, name: “”, primary_address: “”, secondary_address: “”,
city: “”, postal_code: “”, state_code: nil, country_code: “”, phone: “”,
email: “”, website: “”, facebook: “”, twitter: “”, opening_hours: “”,
description: “”, latitude: nil, longitude: nil, logo: nil, currency:
“AED”, created_at: nil, updated_at: nil>}

On 17 August 2012 11:07, network DB [email protected] wrote:

Yeah but in the browser, it just went straight to the show action
without showing any validation warning at all. If it fails validation,
it should render the shops#new action again.

Well you have a bug in your code then. Have a look in development.log
to see what happens when you click the link. Then have a look at the
Rails Guide on Debugging to get further ideas on how to debug the
code.