Param丢失或值为空:post

时间:2018-05-31 10:13:11

标签: ruby-on-rails ruby ruby-on-rails-5

我是关于rails的新手,我尝试为我的用户发帖,但是编辑选项出错了。创建,索引,显示和删除有效,但没有编辑错误:

  

param丢失或值为空:post(在我的post_params上)

我的_form.html.erb(用于创建和编辑):

<%= form_for @post do |f| %>

  <%= render 'shared/post_error' %>

  <%= f.hidden_field :user_id, :value => @current_user.id %>

  <%= f.label :content, "Description :" %><br>
  <%= f.text_area :content, size: "60x12", placeholder: "Parlez un peu de vous" %><br>

  <%= f.submit "Créer l'annonce" %>
  

我的帖子控制器:

class PostsController < ApplicationController
before_action :logged_in?, only: [:index, :show, :new, :create, :edit, :update, :destroy]

def index
  @posts = Post.paginate(page: params[:page])
end

def show
  @post = find_post
end

def new
  @post = Post.new
end

def create
  @post = Post.new(post_params)
  if @post.save
    flash[:success] = "Annonce créée avec succès"
    redirect_to @post
  else
    render 'new'
  end
end

def edit
  @post = Post.update(post_params)
end

def update
  @post = Post.update(post_params)
  if @post.save
    flash[:success] = "Annonce modifiée avec succès"
    redirect_to @post
  else
    render 'edit'
  end
end

def destroy
  Post.find(params[:id]).destroy
  flash[:success] = "Annonce supprimée avec succès"
  redirect_to root_path
end

private

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

def find_post
    @post = Post.find(params[:id])
end
end

我尝试了很多东西,但没有任何作用,错误在一个和First argument in form cannot contain nil or be empty之间发生了变化

提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

按照正确的方式

以正确的方式编辑控制器

class PostsController < ApplicationController
    before_action :logged_in?
    before_action :find_post, only: [:show, :edit, :update, :destroy]
    def index
        @posts = Post.all.paginate(page: params[:page])
    end

    def show
    end

    def new
        @post = Post.new
    end

    def create
        @post = Post.new(post_params)
        if @post.save
          flash[:success] = "Annonce créée avec succès"
          redirect_to @post
        else
          render 'new'
        end
    end

    def edit
    end

    def update
        if @post.save
          flash[:success] = "Annonce modifiée avec succès"
          redirect_to @post
        else
          render 'edit'
        end
    end

    def destroy
        @post.destroy
        flash[:success] = "Annonce supprimée avec succès"
        redirect_to root_path
    end

    private

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

    def find_post
      @post = Post.find(params[:id])
    end
end

@current_user对象我认为它将current_user喜欢

<%= f.hidden_field :user_id, :value => current_user.id %>

答案 1 :(得分:0)

编辑操作不应该用于更新,它应该用于获取将要更新的对象以便更改编辑操作

首先确保用户logged_in?,然后才能执行任何操作,before_action :logged_in?应该先于before_action :find_post

before_action :logged_in?
before_action :find_post, only: [:show, :edit, :update, :destroy]
def edit
  #@post = Post.update(post_params)
end

def update
  @post = Post.update(post_params)
  if @post.save
    flash[:success] = "Annonce modifiée avec succès"
    redirect_to @post
  else
    render 'edit'
  end
end

另请确保user_id: @current_user.id<%= f.hidden_field :user_id, :value => current_user.id %>

这取决于您在current_user gem完成身份验证ID后定义devise的方式,那么它应该是current_user