渲染:编辑不能像我期望的那样工作

时间:2014-09-11 04:28:27

标签: ruby-on-rails

我在rails控制器中有以下两种方法:

  def edit
    @blog = Blog.find_by!(id: params[:id])
  end

  def update
    blog = Blog.find_by!(id: params[:id])
    user = User.find_by!(id: params[:user_id])

    blog.update_attributes(blog_update_params)
    if blog.save
      flash[:success] = 'Updated Blog'
      redirect_to user_blog_path(user.id, blog.id)
    else
      render :edit
    end
  end

让我们假设这个更新失败了,好吧你应该render :edit这意味着,我认为我们应该将博客的id传递给编辑动作并重新呈现表单。这反过来会显示任何错误:

<div class="container-sm">
  <%= form_for @blog, :url => user_blog_path(current_user.id, @blog.id), :html => {:class => 'form-horizontal'} do |f| %>
    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">
        <h1>Edit <%= @blog.title %></h1>
        <p class="text-muted">Want to change the name? Never a simpler place!</p>
      </div>
    </div>

    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-6">
        <%= render :partial => 'form_errors', :object => @blog %>
      </div>
    </div>
    <%= render :partial => 'blog_form', :locals => {:f => f} %>
    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">
        <%= f.submit "Update", :class => 'btn btn-primary' %>
      </div>
    </div>
  <% end %>
</div>

我上面的编辑表格,非常基本。很简单。每个人都很开心。如果我们仍然认为更新失败了它应该重新呈现此表单,但问题是:undefined method id'代表nil:NilClass`发生在:

 <%= form_for @blog, :url => user_blog_path(current_user.id, @blog.id), :html => {:class => 'form-horizontal'} do |f| %>

我在这里做错了什么?每个教程,表单帖子或堆栈问题都说明了这是重新呈现表单以显示任何错误的方式。

当我将binding.pry放在render :edit上方,然后复制并粘贴以使其物理渲染编辑操作时,@blog是空白的。 current_user包含当前用户,在这种情况下是我,@blog是nil。

那么我做错了什么?

1 个答案:

答案 0 :(得分:0)

您未在控制器操作中设置@blog - 您正在设置blog

它必须是一个要传递给视图进行渲染的实例变量,就像它在编辑操作中一样。

不相关,但您可以将Blog.find_by!(id: params[:id])简化为Blog.find(params[:id])