假设您有一个拥有自己的控制器的表单。有没有办法在不同的视图中嵌入此表单(由其他控制器管理)?据我所知,部分模板只携带模板内部的Ruby代码中的逻辑。我想的更多的是一个完整的组件,你可以调用它的控制器。
答案 0 :(得分:1)
表单不是由控制器直接驱动的。是的,这是所有这些魔法的代价。
澄清一下:
是的,我知道这不是世界上最好的/帖子视图,但只是掌握了这个想法
同样的形式,你的表单标签(例如form_for)从控制器获取一个实例(比如@post)和(在编辑模式下)填充你的Post属性。 然后,当你(编辑一些东西)点击提交按钮时,它会发出一个请求(默认情况下是PUT到/ posts)传递表单中的所有值,然后你的控制器获得请求的(POST)值(你看到的那些)在服务器日志中)并使他的工作(如保存帖子的数据)
因此在控制器中你可以使用方法
render :controller => :foo, :action => :bar
渲染另一个与默认控制器操作不同的控制器操作
希望这会有用!
答案 1 :(得分:1)
您可以在任何视图中创建表单以调用任何控制器。在RESTful应用程序中,您通常可以传递一个空对象(使用makevoid中的Posts / Commments示例)
<% form_for @new_comment do |f| %>
<%= f.text_area :text %>
<%= f.submit %>
<% end %>
此表单应引导至create
上的CommentsController
操作。从那里,您可以使用redirect_to :back
来返回触发此控制器的视图。这确实有一些我认为的验证问题。
如果您不是RESTful,则可以使用旧的form_for
样式:
<% form_for :comment, @new_comment, :url => { :controller => "comments", :action => "create" } do |f| %>
<%= f.text_area :text %>
<%= f.submit %>
<% end %>
对于其中任何一个示例,您需要拥有@new_comment
,您将在PostsController
中创建
def show
@post = Posts.find(params[:id])
@new_comment = @post.comments.build
end