视图中的可嵌入组件或如何调用不同的控制器

时间:2010-01-06 20:32:27

标签: ruby-on-rails

假设您有一个拥有自己的控制器的表单。有没有办法在不同的视图中嵌入此表单(由其他控制器管理)?据我所知,部分模板只携带模板内部的Ruby代码中的逻辑。我想的更多的是一个完整的组件,你可以调用它的控制器。

2 个答案:

答案 0 :(得分:1)

表单不是由控制器直接驱动的。是的,这是所有这些魔法的代价。

澄清一下:

  • 您在浏览器中输入http://yourhost/posts
  • 您的请求(GET / posts)命中路由器,然后您的路由器说/ post url属于PostsController且操作是索引
  • 然后您的控制器执行索引方法,执行您的业务逻辑(例如,从数据库加载帖子)
  • 加载视图(views / posts / index ...)并通过'替换'控制器中定义的所有实例变量和内容(例如@posts = Post.all)来运行它
  • 然后您会看到使用帖子列表呈现的视图(如果在视图中您有类似@ posts.map {| p | p.title} .join(“,”))

是的,我知道这不是世界上最好的/帖子视图,但只是掌握了这个想法

同样的形式,你的表单标签(例如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