Currently I’m making an app for users to create picture albums. The catch is that there can be multiple owners for each album, so in the form to create an album there is a check box portion where you highlight your friends names and “invite them” to be an owner. However, I am having a hard time getting it to work since it’s giving me an error in my AlbumsController#create. The error is :
undefined method 'user' for #<Album:0x007fcd9021dd00>
app/controllers/albums_controller.rb:43:in 'create'
Here’s my form
<%= form_for ([@user, @album]), :html => { :id => "uploadform" } do |f| %>
<div class="formholder">
<%= f.label :name %>
<%= f.text_field :name %>
<br>
<label>Hosts</label>
<% @user.friends.each do |friend| %>
<%= friend.name %>
<%= check_box_tag 'album[user_ids][]', friend.id, @album.users.include?(friend) %>
<% end %>
<%= f.label :description %>
<%= f.text_area :description %>
<br>
<%=f.submit %>
</div>
<% end %>
The checkboxes return an array of friend.id values that I want to invite to be owners for the album. The tricky part here is that I have a imaginary pending_album column in my join album_user model. Here’s what is sending me errors that I can’t figure out how to fix:
albums controller
def create
@user = User.find(params[:user_id])
@album = @user.albums.build(params[:album], :status => 'accepted')
@friends = @user.friends.find(params[:album][:user_ids])
for friend in @friends
params[:album1] = {:user_id => friend.id, :album_id => @album.id, :status => 'pending'}
AlbumUser.create(params[:album1])
end
#the next line is where the error occurs. why???
if @user.save
redirect_to user_album_path(@user, @album), notice: 'Album was successfully created.'
else
render action: "new"
end
end
album model
class Album < ActiveRecord::Base
attr_accessible :name, :description, :user_ids
validates_presence_of :name
validates :user, :uniqueness => true
has_many :album_users
has_many :users, :through => :album_users
has_many :photos
end
user model
class User < ActiveRecord::Base
has_secure_password
attr_accessible :email, :name, :password, :password_confirmation, :profilepic
validates_presence_of :password, :on => :create
validates_format_of :name, :with => /[A-Za-z]+/, :on => :create
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
validates_length_of :password, :minimum => 5, :on => :create
# validates :album, :uniqueness => true
has_many :album_users
has_many :albums, :through => :album_users, :conditions => "status = 'accepted'"
has_many :pending_albums, :through => :album_users, :source => :album, :conditions => "status = 'pending'"
accepts_nested_attributes_for :albums
has_many :friendships, :dependent => :destroy
has_many :friends, :through => :friendships, :conditions => "status = 'accepted'"
has_many :requested_friends, :through => :friendships, :source => :friend, :conditions => "status = 'requested'", :order => :created_at
has_many :pending_friends, :through => :friendships, :source => :friend, :conditions => "status = 'pending'", :order => :created_at
has_attached_file :profilepic
before_save { |user| user.email = email.downcase }
def name_with_initial
"#{name}"
end
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
album_user join table model
class AlbumUser < ActiveRecord::Base
attr_accessible :user_ids, :album_id, :status, :user_id
belongs_to :album
belongs_to :user
end
parameters (looks a little fishy… especially since album_id is nil):
{“utf8″=>”✓”,
“authenticity_token”=>”xkIi6+1vjEk4yQcFs9vI1uvI29+Gyuenyp71vhpX9Hw=”,
“album”=>{“name”=>”123123”,
“user_ids”=>[“27”,
“28”],
“description”=>”123123”},
“commit”=>”Create Album”,
“user_id”=>”29”,
“album1″=>{“user_id”=>28,
“album_id”=>nil,
“status”=>”pending”}}
I’m not too sure what I’m doing wrong. Can someone help please!!
The error message is:
All right, so something’s calling
Album#user. Line 46 in the controller is@user.save, so how isusergetting called?savetriggers validations, including that line right there, which validates thatuseris unique. Since this is exploding, I’m guessing thatuseris a column that doesn’t exist, either because a) it’s not defined in a migration or b) you didn’t run the migration.(As an aside, I’m rather confused as to why you would have a unique
userattribute onAlbum, anAlbumUsermodel with bothuser_idanduser_ids, and aUsermodel. Maybe it makes sense, but I think it’s more likely that it all needs a cleanup.)