【问题标题】:CRUD action of one controller in another一个控制器在另一个控制器中的 CRUD 操作
【发布时间】:2017-07-25 10:55:12
【问题描述】:

在另一个控制器中创建一个控制器的 CRUD 操作是一种不好的做法吗?例如我们有两个模型User,Post 和以下控制器:

 class UsersController < ApplicationController
      def show
           @user = User.find(params[:id])
      end

      def update_post #update action of PostsController
           Post.find(params[:post_id]).uppdate_attributes(params[:post])
      end

      def create_post #create action of PostsController
           @user = User.find(params[:id])
           @user.posts.create(params[:post])
      end
 end

我可以/应该这样做还是有更好的方法?这个动作不在他们自己的控制器中的原因是我想在用户页面上操纵帖子。

【问题讨论】:

  • 你不断覆盖我的错字修复。然后自己修复它们:)
  • 请澄清,因为我无法理解,好像您在谈论 User 动作 updatecreatePost 动作 updatecreate
  • “这是一种不好的做法” - 好吧,它看起来确实很奇怪。用户控制器中的帖子相关功能在做什么?这绝对违反了最小意外原则:)
  • 对不起,我刚刚更新了上下文
  • @Pavan: 非常令人沮丧,它是:)

标签: ruby-on-rails


【解决方案1】:

如果您已经有关联,那么这样做是不好的做法并且不切实际。您可以使用userfields_for 来创建/更新`posts。

您需要使用build 实例化帖子,添加到用户模型accepts_nested_attributes_for 并在视图中使用fields_for,用户CRUD 将保存/更新帖子

#user controller
class UsersController < ApplicationController
      def show
           @user = User.find(params[:id])
           @user.posts.build
      end
 end


#user model
accepts_nested_attributes_for :posts


#user/show view
<%= form_for @user do |f| %>
    <%= f.fields_for :posts do |post| %>
      <%= post.text_field :post %>
    <% end %>
<% end %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多