【问题标题】:Rails: "status" not properly being inserted into params?Rails:“状态”未正确插入参数?
【发布时间】:2012-10-11 19:48:18
【问题描述】:

您好,我目前收到表单提交错误。我的应用程序基本上是一个包含用户、相册、图片(用于图片上传)的应用程序。但是,当我尝试创建新专辑时,它给了我错误:

ActiveRecord::RecordNotFound in AlbumsController#show

找不到 id=123 的专辑 [WHERE "album_users"."user_id" = 29 AND (status = 'accepted')]

问题是每个相册可以有多个所有者,因此在创建相册的表单中有一个复选框部分,您可以在其中突出显示您朋友的姓名并“邀请他们”成为所有者。这就是为什么我的创建函数看起来有点奇怪的原因。这里的问题是让 :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

结束

【问题讨论】:

  • @user.albums.create替换@user.albums.build

标签: ruby-on-rails


【解决方案1】:

行:

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

没有意义。只有params[:album] 会受到尊重。使用Hash#merge合并:statusparams[: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'}

受到尊重。这样你就不需要在build 调用中传递:status:status 的值将自动设置为'accepted'

【讨论】:

  • 嘿,感谢 jdoe 的建议。但现在我遇到了另一个错误:SQLite3::SQLException: no such column: albums.status: SELECT COUNT(*) FROM "albums" INNER JOIN "album_users" ON "albums"."id" = "album_users"."album_id" WHERE "album_users"."user_id" = 29 AND ("albums"."status" = 'accepted')status 列是否必须在专辑表中?因为我认为它应该放在album_user 模型中
  • @Edmund 如果您必须为连接模型(在我们的示例中为 AlbumUser)传递其他选项,那么您可以手动创建关系:AlbumUser.create status: 'accepted', user: @user, album: @album。从您的代码中不清楚您的 status 属于哪个模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多