Multiple models one form and a one-to-one relationship


#1

Hi!

I’ve got a not so unfamiliar multiple models in one form problem. Due
to the complex forms railscast I’ve got it up and running for a one-to-
many relationship but now I have a one-to-one relationship and I
didn’t get it done.

Here is my code, perhaps someone can take a look and give me a hint
what’s wrong. I put what is going wrong into the code where I think it
is belonging to. And I don’t know if it matters but I’m running Rails
2.1.1.

Model

class Subscription < ActiveRecord::Base
belongs_to :user

def user=(attributes)
##
# !!! Here is something wrong
# - I get a Hash with all my fields here
# - attributes belongs to class HashWithIndifferentAccess
# - Whith self I get the error „undefined method
`stringify_keys!’…“
# - Without self the subscription model is saved without the user
model

self.build_user(attributes)

end
end

class Subscription < ActiveRecord::Base
has_one :subscription
end

Controller

class SubscriptionsController < ApplicationController
def new
@subscription = Subscription.new
@subscription.build_user

respond_to do |wants|
  wants.html
  wants.xml  { render :xml => @subscription }
end

end

def create
@subscription = Subscription.new(params[:subscription])

respond_to do |wants|
  if @subscription.save
    flash[:notice] = 'Subscription was successfully created.'
    wants.html { redirect_to root_url }
    wants.xml  { render :xml => @subscription, :status

=> :created, :location => @payment }
else
wants.html { render :action => “new” }
wants.xml { render :xml => @subscription.errors, :status
=> :unprocessable_entity }
end
end
end
end

View (Haml syntax)

  • form_for :subscription, @subscription, :url => subscriptions_path do
    |subscription_form|

    … subscription fields

    • subscription_form.fields_for :user do |user_form|

      … user fields

Every help is appreciated. Thanks in advance.

Regards,
Stefan


#2

In a has_one/belongs_to association, I don’t think you need the user=
method. What happens if you take it out completely?


#3

Try self.build_user(:name=>attributes) , name or whatever the column
is.


#4

Without the user method in the subscription model I get the following
error:

User(#17369790) expected, got HashWithIndifferentAccess(#2700040)

I’ve changed the user method:

def user=(attributes)
attributes.each do |attribute|
self.build_user(attribute.first => attribute.last)
end
end

I get no error and the subscripton model is saved, but not the user
model.

These are my parameters:

…“subscription”=>{
“user”=>{
“name”=>“vorname”,
“city”=>“ort”,
“postal_code”=>“plz”,
“street”=>“straße”,
“phone”=>“telefon”,
“c_o”=>“c/o (optional)”,
“surname”=>“nachname”,
“comment”=>“kommentar (optional)”,
“email”=>“e-mail”
}
}…

For me they are not looking that bad.