23318


いまTwitterのようなサイトを作っています。  
つぶやきの投稿画面に文字を入力し保存ボタンを押したら、1件のエラー:  
User can't be blankと表示されます。  
ユーザーの新規登録画面を作成し、そこにユーザー情報を入力し、正常ログインしたあとのエラーで、Userが空である訳がないのですが。。。  
notes_controller.rbのどこかに異常があるということなのでしょうか？  
（tweetをnoteと読んでいます）  
notes_controller.rb

[code]

    class NotesController < ApplicationController 
      before_action :authenticate_user! 
      before_action :correct_user, only: [:edit, :update] 
      before_action :set_note,only:[:show,:edit,:update,:destroy]
    
      def create 
          @note = Note.new(note_params) 
        if @note.save 
          redirect_to @note,notice:'投稿が保存されました' 
        else 
          @notes = Note.all.order(created_at: :desc) 
          render 'home/top' 
          end 
      end
    
      def show 
          @notes = Note.find(params[:id]) 
      end
    def edit 
        @notes = Note.find(params[:id]) 
      end
    
      def update 
        if @note.update(note_params) 
          redirect_to @note, notice: "投稿が更新されました" 
        else 
          render :edit 
        end 
      end
    
      def destroy 
        @note.destroy 
        redirect_to notes_path 
      end
    
      def liking_users 
        @users = @note.liking_users 
      end
    
       private
    
        def set_note 
          @note = Note.find(params[:id]) 
        end
    
        def note_params 
          params.require(:note).permit(:content) 
        end
    
        def correct_user 
     note = Note.find(params[:id]) 
          # noteを投稿したユーザーを取得し、current_user?メソッドの引数に渡してください 
          if !current_user?(note.user) 
            redirect_to root_path, alert: '許可されていないページです' 
          end 
        end
    
    end 
    
[/code]

notes_controller.rb

[code]

    class NotesController < ApplicationController 
      before_action :authenticate_user! 
      before_action :correct_user, only: [:edit, :update] 
      before_action :set_note,only:[:show,:edit,:update,:destroy]
     def create 
          @note = Note.new(note_params) 
        if @note.save 
          redirect_to @note,notice:'投稿が保存されました' 
        else 
          @notes = Note.all.order(created_at: :desc) 
          render 'home/top' 
          end 
      end
    
      def show 
          @notes = Note.find(params[:id]) 
      end
    
      def edit 
        @notes = Note.find(params[:id]) 
      end
    
      def update 
        if @note.update(note_params) 
          redirect_to @note, notice: "投稿が更新されました" 
        else 
          render :edit 
        end 
      end
    
      def destroy 
        @note.destroy 
        redirect_to notes_path 
      end
    
      def liking_users 
        @users = @note.liking_users 
      end
    
     private
    
        def set_note 
          @note = Note.find(params[:id]) 
        end
    
        def note_params 
          params.require(:note).permit(:content) 
        end
    
        def correct_user 
          note = Note.find(params[:id]) 
          # noteを投稿したユーザーを取得し、current_user?メソッドの引数に渡してください 
          if !current_user?(note.user) 
            redirect_to root_path, alert: '許可されていないページです' 
          end 
        end
    
    end 
    
[/code]

noteのmodelのnote.rb

[code]

    class Note < ActiveRecord::Base 
        belongs_to :user 
        has_many :likes, dependent: :destroy 
        has_many :liking_users, through: :likes, source: :user
    
    validates :content, presence: true, length: { maximum: 140 } 
        validates :user_id, presence: true 
    end
    
[/code]


CC BY-SA 3.0
2016-03-21T08:00:54.530
23316
2016-03-21T10:18:07.073
2016-03-21T08:41:18.790
8000
14754
question
ruby-on-rails
User can't be blankの解消方法


`user_id` (`user`) に代入している部分が見当たりません。おそらく Devise
を使っていると思いますが、無関係のモデルに自動的に代入する機能はありません。

`@note = Note.new(note_params)` の直後で、その値を確認してみると `user_id` は `nil`
になっているはずです。その直後に次のようなコードを入れれば期待通りに動作するはずです。

[code]

    @note.user = current_user
    
[/code]


CC BY-SA 3.0
2016-03-21T10:18:07.073
23318
2016-03-21T10:18:07.073
76
23316
answer