Ruby on Rails Tuesday, May 1, 2012

My question can be succinctly put: Is it possible to set an additional attribute on the join model when usingaccepts_nested_attributes_for? 

On Tuesday, May 1, 2012 12:05:05 PM UTC-4, Mohamad El-Husseini wrote:

I have User, Account, and Role models. The Account model accepts nested properties for users. This way users can create their account and user records at the same time.

class AccountsController < ApplicationController
 
def new
   
@account = Account.new
   
@user = @account.users.build
 
end
end

The above will work, but the user.roles.type defaults to member. At the time of registration, I needuser.roles.type to default to admin. This does not work:

class AccountsController < ApplicationController
 
def new
   
@account = Account.new
   
@role = @account.role.build
   
# Role.type is protected; assign manually
   
@role.type = "admin"
   
@user = @account.users.build
 
end
end

I thought about inheritance, but it really complicate things. I need roles to be dynamic so users can add their own admins and mods, and so on. I think I'm running into these issues because I'm not modeling my data modeling correctly.

Accounts#new

<%= simple_form_for(@account, html: { class: 'form-horizontal' }) do |f| %>
 
<legend>Account Details</legend>
  <%= render 'account_fields', f: f %>

  <%= f.simple_fields_for :users do |user_form| %>
    <legend>Personal Details</
legend>
   
<%= render 'users/user_fields', f: user_form %>
 
<% end %>

 
<%= f.submit t('views.accounts.post.create'), class: 'btn btn-large btn-primary' %>
<% end %>

Models:

class User < ActiveRecord::Base
  has_many
:roles
  has_many
:accounts, through: :roles
end

class Account < ActiveRecord::Base
  has_many
:roles
  has_many
:users, through: :roles
  accepts_nested_attributes_for
:users
end

# user_id, account_id, type [admin|moderator|member]
class Role < ActiveRecord::Base
  belongs_to
:user
  belongs_to
:account
  after_initialize
:init

  ROLES
= %w[owner admin moderator member]

  private
 
def init
   
self.role = "member" if self.new_record?
 
end
end


--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/tuAoRXG8KD0J.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

No comments:

Post a Comment