根据http://guides.rubyonrails.org/layouts_and_rendering.html
我应该能够在我的micropostscontroller中的创建操作中定义来自不同控制器的路径:
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to profile_path
else
render 'static_pages/profile'
end
end
当我创建帖子失败时(将其留空或使其太长),将呈现页面'/ microposts',即控制器不存在的主页。当我成功创建微博时,我被重定向到配置文件路径'/ profile',当我将render 'static_pages/profile'
更改为redirect_to profile_path
时,重定向就会起作用。为什么浏览器会忽略渲染请求并进入微博控制器回家?
此外,渲染的微博页面给出NoMethodError:
NoMethodError in Microposts#create
undefined method `name' for nil:NilClass
<% provide(:title, @user.name) %>
app/views/static_pages/profile.html.erb:16:in `_app_views_static_pages_profile_html_erb___1610169404003779010_70327969935820'
app/controllers/microposts_controller.rb:10:in `create'
当重定向到配置文件时,配置文件可以自行呈现,因为在static_pages控制器中的配置文件操作中定义了@user。 @user = User.find_by_remember_token(cookies[:remember_token])
答案 0 :(得分:3)
您的create方法正在尝试呈现'app / views / static_pages / profile.html.erb',但您还没有为其提供@user来呈现。如果您以这种方式修改代码,它应该可以工作:
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to profile_path
else
@user = current_user # Add this line!
render 'static_pages/profile'
end
end
请注意,microposts#create
方法的路径为/microposts
,因此除非您使用redirect_to
代替render
,否则仍会显示在地址栏中。
答案 1 :(得分:0)
我认为你误解了render
的作用。它只是更改呈现的模板。它不会导致控制器中与模板相关的任何代码(如果有的话)被执行。
堆栈跟踪显示它正在呈现您请求的文件,尽管它似乎需要定义@user
,而您在创建操作中似乎没有这样做。将@user
设置为current_user
,您应该没问题。
重定向可能是一个更好的选择 - 如果用户刷新页面,它可能会重新提交表单数据,而重定向则不会发生。