0

現在、ユーザーが写真アルバムを作成するためのアプリを作成しています。問題は、各アルバムに複数の所有者が存在する可能性があることです。そのため、アルバムを作成するフォームには、友人の名前を強調表示して所有者になるように「招待」するチェック ボックス部分があります。しかし、それは私にエラーを与えているので、それを機能させるのに苦労していますAlbumsController#create. エラーは次のとおりです。

undefined method 'user' for #<Album:0x007fcd9021dd00>

app/controllers/albums_controller.rb:43:in 'create'

これが私のフォームです

<%= 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 %>

friend.idチェックボックスは、アルバムの所有者になるよう招待したい値の配列を返します。ここで注意が必要なのpending_albumは、結合 album_user モデルに架空の列があることです。修正方法がわからないというエラーが表示されるのは次のとおりです。

アルバム コントローラ

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

アルバムモデル

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

ユーザーモデル

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

終わり

album_user ジョイン テーブル モデル

class AlbumUser < ActiveRecord::Base
  attr_accessible :user_ids, :album_id, :status, :user_id
  belongs_to :album
  belongs_to :user
end

パラメータ (少し怪しげに見えます... 特に album_id が nil であるため):

{"utf8"=>"✓", "authenticity_token"=>"xkIi6+1vjEk4yQcFs9vI1uvI29+Gyuenyp71vhpX9Hw=", "アルバム"=>{"名前"=>"123123", "user_ids"=>["27"," 28"]、"説明"=>"123123"}、"コミット"=>"アルバムの作成"、"user_id"=>"29"、"album1"=>{"user_id"=>28、"album_id"= >nil、「ステータス」=>「保留中」}}

何が間違っているのかよくわかりません。誰か助けてください!!

4

2 に答える 2

1

あなたのアルバムには本当に多くのユーザーがいますか? 次に、メソッド「ユーザー」を返す必要がありますか?1 つのユーザー所有のアルバムが必要な場合belongs_toは、モデルで使用する必要があります。次に、メソッド「user」は正しいユーザーをアルバムに返します

于 2012-10-11T19:13:26.343 に答える
1

エラーメッセージは次のとおりです。

undefined method 'user' for #<Album:0x007fcd9021dd00>

よし、何かが呼んでいるAlbum#user。コントローラーの 46 行目は です。@user.saveでは、どのようuserに呼び出されるのでしょうか。

class Album < ActiveRecord::Base
  attr_accessible :name, :description, :user_ids
  validates_presence_of :name

  validates :user, :uniqueness => true    # <-- bam!

  has_many :album_users
  has_many :users, :through => :album_users
  has_many :photos
end

saveその行を含めて検証をトリガーし、それuserが一意であることを検証します。userこれは急増しているため、a) 移行で定義されていないか、b) 移行を実行していないため、存在しない列であると推測しています。

(余談ですが、 、 と の両方を持つモデル、およびモデルに一意のuser属性を設定する理由について、かなり混乱しています。おそらくそれは理にかなっていますが、すべてをクリーンアップする必要がある可能性が高いと思います。)AlbumAlbumUseruser_iduser_idsUser

于 2012-10-11T19:14:16.547 に答える