创建和更新不再起作用。有什么建议么?还是原因?

时间:2019-04-04 13:59:09

标签: ruby-on-rails ruby web crud

我正在尝试构建一个简单的博客类型应用程序,以学习Rails中的Ruby。创建曾经可以使用,但是在添加了编辑/更新功能之后,创建和编辑均不起作用。我不确定自己做错了什么。编辑不会使用新数据更新,并且创建不再接受新数据。例如:无论写什么内容,创建新帖子都会导致空白帖子,并且在将新文本添加到旧帖子时,单击“提交”后不会更改该帖子。

我的控制器:

def create
    @post = Post.create(post_params)

    if @post.save(post_params)
      redirect_to @post
    else 
      render 'new'
    end
end

def show
    @post = Post.find(post_params[:id])
end

def update
    @post = Post.find(params[:id])
    if @post.update_attributes(post_params)
      redirect_to @post
    else
      render 'edit'
    end
end

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

def post_params
    params.permit(:title, :detail)
end

编辑和创建html文件都会渲染表单页面:

<div class="section">
    <%= simple_form_for @post do |f| %>
       <%= f.input :title %>
       <%= f.input :detail %>
       <%= f.button :submit %>
    <% end %>
</div>

2 个答案:

答案 0 :(得分:0)

def create
  @post = Post.new(post_params)  # use Post.new, don't create already
  if @post.save                  # if above Post is saved then redirect
    redirect_to @post 
  else 
    render 'new'
  end
end

def show
  @post = Post.find(params[:id])  #use params[:id], not post_params[:id]
end

def update
  @post = Post.find(params[:id])           #use params[:id] to find the post
  if @post.update_attributes(post_params)  #use post_params for attributes
    redirect_to @post
  else
    render 'edit'
  end
end

def edit
   @post = Post.find(params[:id])        #use params[:id] to find post
end

private

def post_params
  params.require(:post).permit(:title, :detail)
  # Don't permit the ID as you don't want to change the ID.
end

答案 1 :(得分:0)

问题可能出在您的post_params方法上。我猜您在允许其属性之前必须先使用:post键。通常,simple_form(和其他表单引擎)将按以下方式组装有效负载:

{
  "utf8": "✓",
  "authenticity_token": "...",
  "commit": "Create Post",
  "post": {
    "title": "Opa",
    "content": "teste"
  }
}

因此,如果您params.permit(:title, :detail, :id),您将得到一个空哈希。这可能就是帖子保存为空属性的原因。

您将必须

params.require(:post).permit(:title, :detail)

默认情况下,已经允许使用url参数(您在/posts/:id之类的路由中定义的参数),因此您不必允许也不要求它。