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

时间:2015-01-04 18:16:40

标签: ruby-on-rails ruby-on-rails-4 render

我正在使用包含用户控制器和图像控制器的rails应用程序。这是Images控制器中的create方法:

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

成功保存处理得很好,但如果图片太大或不存在且用户/显示'渲染时,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'所需的所有变量。在我的Images控制器中,所以我将内容从Users控制器的show方法移动到Application控制器中的新方法,并在从Images渲染页面之前调用它。这是intitialize方法:

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应用程序,所以我很感激帮助。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

看起来你的模板(users/show)使用了在这种情况下不可用的东西(@vars)。你能展示一下模板代码吗?也许你在那里有一些行@user.name但是如果你描述了这个变量,那么这个var就没有初始化......