2017-05-10 10 views
0

レールアプリの認証にdeviseを使用していますが、すべてうまくいきますが、ポストモデルがあり、新しい投稿を作成しようとするとサインアップした後にエラーが表示されます:許容されていないパラメータ:レールのuser_idエラー

1 error prohibited this post from being saved: 
User must exist 

Iは、端末に見て、この得た:私は

users_controller.rbユーザコントローラ を追加しようとした

Unpermitted parameter: user_id 
    (0.0ms) begin transaction 
    (0.0ms) rollback transaction 

class UsersController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_user 
    before_action :check_ownership, only: [:edit, :update] 
    respond_to :html, :js 

# GET /users 
     # GET /users.json 
     def index 
     @users = User.all 
     end 

     # GET /users/1 
     # GET /users/1.json 
     def show 
     end 

     # GET /users/new 
     def new 
     @user = User.new 
     end 

     # GET /users/1/edit 
     def edit 
     end 

     # POST /users 
     # POST /users.json 
     def create 
     @user = User.new(user_params) 

     respond_to do |format| 
      if @user.save 
      format.html { redirect_to @user, notice: 'User was successfully created.' } 
      format.json { render action: 'show', status: :created, location: @user } 
      else 
      format.html { render action: 'new' } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
      end 
     end 
     end 

     # PATCH/PUT /users/1 
     # PATCH/PUT /users/1.json 
     def update 
     respond_to do |format| 
      if @user.update(user_params) 
      format.html { redirect_to @user, notice: 'User was successfully updated.' } 
      format.json { head :no_content } 
      else 
      format.html { render action: 'edit' } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
      end 
     end 
     end 

     # DELETE /users/1 
     # DELETE /users/1.json 
     def destroy 
     @user.destroy 
     respond_to do |format| 
      format.html { redirect_to users_url } 
      format.json { head :no_content } 
     end 
     end 

     private 
     # Use callbacks to share common setup or constraints between actions. 
     def set_user 
      @user = User.find(params[:id]) 
     end 

     # Never trust parameters from the scary internet, only allow the white list through. 
     def user_params 
      params.require(:user).permit(:name, :email) 
     end 
    end 

私posts_controler.rb

class PostsController < ApplicationController 
    before_action :authenticate_user!, :except => [:show, :index] 
    before_action :set_post, only: [:show, :edit, :update, :destroy] 

    # GET /posts 
    # GET /posts.json 
    def index 
    @posts = Post.all 
    end 

    # GET /posts/1 
    # GET /posts/1.json 
    def show 
    end 

    # GET /posts/new 
    def new 
    @post = Post.new 
    end 

    # GET /posts/1/edit 
    def edit 
    end 

    # POST /posts 
    # POST /posts.json 
    def create 
    @post = Post.new(post_params) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render :show, status: :created, location: @post } 
     else 
     format.html { render :new } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /posts/1 
    # PATCH/PUT /posts/1.json 
    def update 
    respond_to do |format| 
     if @post.update(post_params) 
     format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
     format.json { render :show, status: :ok, location: @post } 
     else 
     format.html { render :edit } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.json 
    def destroy 
    @post.destroy 
    respond_to do |format| 
     format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_post 
     @post = Post.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def post_params 
     params.require(:post).permit(:tittle, :body) 
    end 
end 

私のユーザモデル

class User < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

     has_many :posts 
end 

マイポストモデル

class Post < ApplicationRecord 
    belongs_to :user 
end 

私はまた、この移行を介してユーザにuser_idを追加しました:あなたはあなたのモデルに列を追加する場合

class AddUseridToPost < ActiveRecord::Migration[5.0] 
    def change 
    add_column :posts, :user_id, :integer 
    end 
end 
+0

許可する必要はありません:user_idも? –

答えて

2

エラーが言うように、

def post_params 
    params.require(:post).permit(:tittle, :body, :user_id) 
end 

または、より良いアプローチあなたがのようにLOGGED_INユーザーのための新しいポストを発生さを次のようにuser_idを許可投稿は作成:

def create 
    @post = current_user.posts.new(post_params) 
    # ...other logic 
end 

この方法では、あなたもuser_idを許可する必要はありません、それはのparamsはTAMていないことを保証します..

0

、あなたの許可のparamsに追加する必要があります。だから、posts_controllerであなたの許可のparamsに:user_idを追加します。

def post_params 
    params.require(:post).permit(:tittle, :body, :user_id) 
end 
関連する問題