Ruby-On-Rails - 无法访问post model / post controller #create中的current_user

时间:2017-11-27 03:07:36

标签: ruby-on-rails model watermark

我对编码比较陌生,如果这非常简单,那么道歉,但我现在已经坚持这个问题大约一个星期了!我尝试访问已上传的图片,以用作其他图片的水印。我已经删除了我认为必要的内容,但如果您认为有任何遗漏,请告诉我。

我想访问current_user并使用该id来定义url的路径。我知道这段代码在某种程度上有效:

User.find(1).watermarkimage.url(:medium)

但我想用当前用户替换1。

在:watermark_path下,我尝试过: User.find(attachment.instance.user_id).watermarkimage; attachment.instance.user_id.watermarkimage; owner.watermarkimage,current_user; current_user.id,User.find(current_user.id)和其他一些没有运气的人。很多时候我得到了:

Couldn't find User with 'id'=

user_id出现在参数中,这让我感到很困惑。如果您能让我知道为什么我无法在此模型中访问它,我真的很感激。

发布模型

class Post < ActiveRecord::Base 
before_create :owner
belongs_to :user
validates :user_id, presence: true
validates :media, presence: true
validates :caption, length: { minimum: 3, maximum: 300 }

def owner
 self.user_id = current_user.id
end

has_attached_file :media, :styles => lambda { |attachment| {
              :large => {
                  :processors => [:watermark],
                  :geometry => "800>",
                  :watermark_path => self.current_user.watermarkimage.url(:medium),
                  :position => 'SouthEast'
              }
             }
            }, :default_url => "#{Rails.root}/public/apercha logo.jpg"
validates_attachment_content_type :media, :content_type => /.*/

后控制器

class PostsController < ApplicationController  
  before_action :authenticate_user!
  ...
    def create
@post = current_user.posts.build(post_params)

if @post.save
  flash[:success] = "Your post has been created!"
  redirect_to posts_path
else
  flash[:alert] = "Your new post couldn't be created!  Please check the form."
  render 'new'
end
end

模式

create_table "posts", force: :cascade do |t|
...
  t.integer  "user_id"
...
end
  add_index "posts", ["user_id"], name: "index_posts_on_user_id", using: :btree

1 个答案:

答案 0 :(得分:0)

如果这是为了替换has_attached_file验证中的代码,您应该可以说user.watermarkimage.url(:image)之类的内容。

如果post belongs_to :user您应该能够在仅user的帖子实例上呼叫该用户。模型不应该知道当前用户是谁(Access Devise's current_user in Model)。

此外,由于您在控制器中通过current_user.posts.build创建帖子,因此会为您设置帖子上的用户。您不需要before_create回拨来设置用户。