在Rails 4中从另一个控制器渲染Action模板

3
我正在尝试在post/show视图中呈现replies/new视图。当我尝试时,出现了问题。
render "replies/new" 

它显示错误,似乎它正在寻找某些内容。
replies/_new.html.erb

当我使用时,它有效了

render template: "replies/new"

但是看起来它没有在回复控制器中激活新的操作,因此它不会创建新的回复。我可以在帖子显示操作中添加类似于@reply = Reply.new的内容,但我认为必须有更多DRY的方法来解决它。


你把render 'replies/new'放在哪里了?是在模板中还是控制器操作中? - Jagdeep Singh
另一种方法是将新的回复对象作为局部变量传递。例如: <%= render partial: 'replies/new', locals: {reply: Reply.new} %> - Emu
在模板中 @JagdeepSingh - J.Krzus
1
那就是预期的行为。Rails会将其视为部分名称并搜索__new.html/erb_。 - Jagdeep Singh
请展示更多您的控制器和视图(_show_)代码,以便我们更好地帮助您。 - Jagdeep Singh
@JagdeepSingh 感谢您的帮助,但解决方案已经在下面了。 - J.Krzus
1个回答

3

但看起来它没有在回复控制器中激活新的操作,因此它不会创建新的回复

原因:-渲染不会创建一个新的HTTP请求(渲染不会加载与控制器操作相关联的任何上下文。因此,它将呈现模板),你可能会在那个新操作中有很多代码,但没有任何代码会运行,只有视图会被呈现。

你可以尝试这个:

posts#show

def show
  #foo = bar
  render "replies/new", locals: {reply: Reply.new}
end

这样,你在replies#new中也需要使用本地变量。

def new
  #foo = bar
  reply = Reply.new
  render locals: {reply: reply}
end

replies/new.html.erb 中,使用回复代替@回复

谢谢。现在这个有意义了。但是似乎在posts#show中添加**@reply = Reply.new**会少很多代码。您对这个解决方案有什么看法? - J.Krzus
1
@J.Krzus 是的,你也可以这样做。 :D - Anand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接