【问题标题】:Undefined method `update' for nil:NilClass rails 4.0.0nil的未定义方法“更新”:NilClass rails 4.0.0
【发布时间】:2013-07-23 19:35:38
【问题描述】:

我是 Ruby on Rails 和堆栈溢出的初学者。很抱歉,如果在问这个问题时有错误或......

我正在尝试为我的博客项目编写编辑/更新。这是我的控制器:

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

  def update
    @post.update(params[:post].permit(:title, :summary, :content))
    redirect_to posts_path
  end 

这是我的看法:

<h1>Edit Page</h1>
        <%= form_for @post do |f| %>
        Title: <%= f.text_field :title %>
        Summary: <%= f.text_area :summary %>
        Content: <%= f.text_area :content %>
        <%= f.submit "Update" %>
<% end %>

当我想更新任何帖子时,我不断收到此错误:

PostsController#update 中的 NoMethodError

nil:NilClass 的未定义方法“更新”

任何帮助将不胜感激! :)

【问题讨论】:

  • 请在 before_filter 中设置@post。
  • new syntaxbefore_filter 现在是 before_action

标签: ruby-on-rails ruby


【解决方案1】:

您必须将@post 实例变量设置为指向适当的Post 对象才能对其执行更新:

@post = Post.find params[:id]

【讨论】:

    【解决方案2】:

    您还可以使用before_action 设置@post

    class PostsController < ApplicationController
      before_action :set_post, only: [:edit, :update]
    
      # GET /posts/1/edit
      def edit
      end
    
      # PATCH/PUT /posts/1
      # PATCH/PUT /posts/1.json
      def update
      end
    
      private
        # Use callbacks to share common setup or constraints between actions.
        def set_post
          @post = Post.find(params[:id])
        end
    end
    

    现在,只要 rails 触发您的 editupdate 操作,它就会将 @post 设置为“当前”帖子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多