【问题标题】:model which belongs to User, unable to access user_id属于用户的模型,无法访问 user_id
【发布时间】:2017-03-02 01:21:44
【问题描述】:

我有一个应用程序,可以在其中批准或拒绝周对象,这是在周控制器中完成的。我的周模型 belongs_to 用户。这是我在周控制器中所做的一个简短示例:

第一个块是为某些上下文提供的:

def approve
@user = current_user
if params[:commit] == "Approve selected weeks"
  Week.where(id: params[:weeks_ids]).update_all(approved?: true)
  flash[:success] = "Selected weeks were approved!"
  #Send an email noting it was approved
  @user.send_approved(current_user)

下面是拒绝的一半:

elsif params[:commit] == "Reject selected weeks"
  user_week = Week.where(id: params[:weeks_ids])
  user_week.update_all(approved?: false)

以上,周已完美更新。下面,我尝试从选定的周检索用户,以便向该用户发送电子邮件。

  #get the user associated with the rejected week, send them an email.
  user_email = User.find(id: user_week.user_id)
  UserMailer.send_rejection(user_email).deliver

  flash[:info] = "Selected weeks were Rejected."
  end
  redirect_to weeks_path
end

但是,当我尝试拒绝一周时,我收到以下错误:

undefined method `user_id' for <Week::ActiveRecord_Relation:0x007fdcac43e730>

这是由于未指定的用户对象造成的吗?

【问题讨论】:

  • 注意-我在这里添加了预先存在的代码,并且对 MVC 或 rails 语法知之甚少。我整天都在查看堆栈溢出,但不知何故没有发现任何看起来相同的东西,但我肯定会弄错。

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

Week::ActiveRecord_Relation 是一组记录,而不仅仅是一个记录...这就像在一个数组上调用user_id,它不会完全按照你想要的方式工作。

您想要的是在 Week 的单个实例上调用 user_id 为此,您可以:

a) 取出一周(可能不是你想要的)

b) 在活动关系上运行 each 例如:

user_weeks.each do |user_week|
  #get the user associated with the rejected week, send them an email.
  user_email = User.find(user_week.user_id)
  UserMailer.send_rejection(user_email).deliver
end

c) 通过将 user_weeks 转换为 user_ids 来获取 user_emails 集(然后遍历电子邮件),例如:

# get the user associated with the rejected week, send them an email.
users = User.find(user_weeks.pluck(:user_id))
users.each do |user|
  UserMailer.send_rejection(user).deliver
end

d) 假设它总是针对同一个用户,并且只使用第一周,例如:

  #get the user associated with the rejected week, send them an email.
  user_email = User.find(user_week.first.user_id)
  UserMailer.send_rejection(user_email).deliver

【讨论】:

  • 请原谅我的无知,但我现在在选择与第七个用户关联的一周时出现以下错误:“找不到具有 'id'={:id=>[7]} 的用户” .对于 cmets 来说,这个问题的答案是否过于冗长?
  • 哦,是的...find 不需要您使用id,我只是复制了您的代码。我会更新我的答案。
  • 谢谢!现在看来我的邮件程序有问题..“UserMailer:Class 的未定义方法‘send_rejection’”但这对于一个新问题来说肯定足够了。
【解决方案2】:

user_week 似乎是几个星期的集合,而不是一个星期。

您可能正在寻找的是发送多封拒绝电子邮件。您可以在user_weeks 中循环所有周,并通过以下方式发送多封电子邮件:

  elsif params[:commit] == "Reject selected weeks"
    user_weeks = Week.where(id: params[:weeks_ids])
    user_weeks.update_all(approved?: false)     
    user_weeks.each do |w|
      user_email = User.find(id: w.user_id)
      UserMailer.send_rejection(user_email).deliver
    end
    flash[:info] = "Selected weeks were Rejected."
  end
  redirect_to weeks_path
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2013-01-12
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多