0

こんにちは、現在、フォーム送信時にエラーが発生しています。私のアプリは基本的に、ユーザー、アルバム、写真(写真のアップロード用)を備えたものです。ただし、新しいアルバムを作成しようとすると、次のエラーが表示されます。

ActiveRecord::AlbumsController#show の RecordNotFound

ID=123 のアルバムが見つかりませんでした [WHERE "album_users"."user_id" = 29 AND (status = 'accepted')]

問題は、各アルバムに複数の所有者が存在する可能性があることです。そのため、アルバムを作成するフォームには、友人の名前を強調表示して所有者になるように「招待」するチェック ボックス部分があります。これが、私の create 関数が少し奇妙に見える理由です。ここでの問題は、:status => 'accepted' を正常に挿入することです。助けてください!

アルバム コントローラ

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


def show
  @user = User.find(params[:user_id])
  @album = @user.albums.find(params[:id]) #error occurs on this line
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

終わり

4

1 に答える 1

1

この線:

@album = @user.albums.build(params[:album], :status => 'accepted')

意味がありません。だけparams[:album]が尊重されます。Hash#merge を使用して and を結合:statusしますparams[:album](最後のものを変更せずに):

@album = @user.albums.build(params[:album].merge(:status => 'accepted'))

注意してください!

関連付けの条件を指定しましたalbums:

has_many :albums, :through => :album_users, :conditions => "status = 'accepted'"

ただし、関連付けられたアルバム ( など) を作成する際には考慮されません@user.album.buildハッシュのように指定する必要があります:

has_many :albums, :through => :album_users, :conditions => {status: 'accepted'}

敬意をもって扱われること。:statusこれにより、build通話を渡す必要がなくなります。の値は:status自動的に に設定されます'accepted'

于 2012-10-11T20:19:13.677 に答える