2017-11-27 10 views
0

これは非常にシンプルなので、私は謝罪するのが比較的新しいですが、私はこの問題を約1週間今すぐ!私は既にアップロードされている画像にアクセスして、別の画像の透かしとして使用しようとしています。私は必要と思われるものを切り抜いたが、欠けていると思われるものがあれば教えてください。Ruby-On-Rails - ポストモデル/ポストコントローラ#の作成時にcurrent_userにアクセスできない

私は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 

答えて

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コールバックは必要ありません。

+0

こんにちは!答えてくれてありがとう。ロジックが理解できるようになりました。私がそれを行うと、未定義のメソッドwatermarkimageがnilになる:PostsController#createのNoMethodErrorの下にあるNilClass。何か案は? –

+0

私はうんざりです。検証段階にあるので、実際には 'self.user.watermarkimage.url(:medium)'を呼び出す必要があると思います。 – inveterateliterate

関連する問題