从另一个控制器渲染模板会导致 NoMethodError

Rendering template from another controller causes NoMethodError

我正在开发一个包含用户控制器和图像控制器的 rails 应用程序。这是图像控制器中的创建方法:

def create
  @image = current_user.images.build(image_params)
  if @image.save
    flash[:success] = "Image uploaded!"
    redirect_to current_user
  else
    render 'users/show'   #Error occurs here
  end
end

成功的保存处理得很好,但如果图像太大或不存在并且 'users/show' 被渲染,rails 给出错误:

NoMethodError (undefined method `name' for nil:NilClass):
  app/views/users/show.html.erb:1:in `_app_views_users_show_html_erb___2850090823537495038_37901140'
  app/controllers/images_controller.rb:12:in `create' 

我预计会发生这种情况,因为我没有在我的图像控制器中初始化 'users/show' 所需的所有变量,所以我将内容从用户控制器的显示方法移动到应用程序中的一个新方法控制器并在从图像渲染页面之前调用它。这是初始化方法:

def initialize_show
  @user = User.find(params[:id])
  @images = @user.images.paginate(page: params[:page])
  @image = current_user.images.build if logged_in?
end

以及新的创建方法:

def create
  @image = current_user.images.build(image_params)
  if @image.save
    flash[:success] = "Image uploaded!"
    redirect_to current_user
  else
    initialize_show   # Called this method
    render 'users/show'
  end
end

现在 rails 给出错误:

ActiveRecord::RecordNotFound (Couldn't find User with 'id'=):
  app/controllers/application_controller.rb:6:in `initialize_show'
  app/controllers/images_controller.rb:12:in `create'

我在这里错过了什么?这是我的第一个 rails 应用程序,非常感谢您的帮助。

ptd 在上面的评论中提供了答案。 @user 没有被初始化,因为 id 参数没有发布到 images#create。解决方法如下:

  def create
    @image = current_user.images.build(image_params)
    if @image.save
      flash[:success] = "Image uploaded!"
      redirect_to current_user
    else
      @user = current_user
      initialize_show    # I removed the @user initialization in this method
      render 'users/show'
    end
  end

您的模板 (users/show) 似乎使用了在本例中不可用的内容 (@vars)。你能展示那个模板代码吗?也许你有一些行 @user.name 但如果你描述了这个 var 没有初始化......