2017-05-10 1 views
0

레일 앱의 인증에 문제가 있지만 모든 기능이 작동하지만 포스트 모델이 있습니다. 새 게시물을 만들려고하면 가입 후 오류가 발생합니다 :허용되지 않는 매개 변수 : 레일에 user_id 오류

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

난 단말 들여다 본 얻었다 :

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

나 사용자에게 컨트롤러 users_controller.rb을 추가하는 시도를

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

으로 더 좋은 방법은 당신이 logged_in 사용자를위한 새 게시물을 생성하고,

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

다음 또는 같이 user_id을 허용 같이 게시물 작성 :

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

이 방법은, 당신은 또한 user_id을 허용 할 필요가 없습니다, 그것은 PARAMS가 탐되지 않도록한다 ..

0

, 당신이 당신의 허용 PARAMS에 추가해야합니다. 그래서 posts_controller에 허용 PARAMS에 :user_id를 추가 오류가 말한다

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