从另一个控制器渲染模板会导致 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 没有初始化......
我正在开发一个包含用户控制器和图像控制器的 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 没有初始化......