Rails - 在ActiveRecord数据库查询中使用current_user.id

时间:2016-03-23 15:09:34

标签: ruby-on-rails devise

我在Rails中开发一个基本的照片库网站,允许用户上传图片。我使用Devise进行用户身份验证。我的图像模型有一个uid字段,用于在上传图像时保存当前用户的ID。

这是控制器中的create方法:

  def create
        @image = Image.new(image_params)
        @image.uid = current_user.id
        if @image.save
          redirect_to @image
        end
      end

然后在视图中我想要检索数据库中uid与当前用户的ID匹配的所有图像(即,显示所有当前用户的图像)。现在我有:

<% Image.where("uid == current_user.id") do |image|%>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    <!--<img class="img-responsive" src="<%image.image_url%>" alt="">-->
                    <%= image_tag image.image_url(:thumb) %>
                </a>
            </div>
            <% end %>

但是,没有显示图像,我猜是因为像这样的current_user.id只是返回nil。

是否可以使用current_user.id值查询ActiveRecord数据库?

2 个答案:

答案 0 :(得分:4)

您的语法仅适用于您尝试执行的操作:

<% images = Image.where("uid =?", current_user.id) %>

然后,您可以使用.each

循环播放图像

答案 1 :(得分:1)

虽然您可以简单地使用参数化查询,例如@ toddmetheny的优秀答案,但是有一个更好的传统 Rails方式来处理链接记录。

重命名images.uiduser_id。这使您可以在很少的配置下使用ActiveRecord关系。

uid对于外键列来说也是一个糟糕的名称选择,因为它是unique identifier的通用缩写,因此它违反了原则中最不可思议的 - 这是一种就像一个很好的方式来说,不要为任何可怜的灵魂使用你的代码设置一堆陷阱。

class RenameImagesUidToUserId < ActiveRecord::Migration
  def change
    rename_column :images, :uid, :user_id
  end
end    

然后在两个模型之间建立关系:

class User < ActiveRecord::Base
  has_many :images
end

class Image ActiveRecord::Base
  belongs_to :user
end

这可以让您User.find(1).imagesImages.find(1).user

您可以像这样创建关联记录:

def create
  @image = current_user.images.new(image_params)
  if @image.save
    redirect_to @image
  end
end

然后列出你可以做的图像:

<% current_user.images.each do |image| %>
  <div class="col-lg-3 col-md-4 col-xs-6 thumb">
    <a class="thumbnail" href="#">
      <%= image_tag image.image_url(:thumb) %>
    </a>
  </div>
<% end %>