Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 最佳实践:如何在具有平等访问模型的控制器中拆分关联函数_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 最佳实践:如何在具有平等访问模型的控制器中拆分关联函数

Ruby on rails 最佳实践:如何在具有平等访问模型的控制器中拆分关联函数,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有两种平等访问模型:用户和类别 其中每一项都应该有标准操作:索引、新建、创建、编辑、更新和销毁 但是,当我想在这两个模型之间创建关联时,我在哪里集成关联呢 我是否必须编写两次几乎相同的代码: class UsersController << ApplicationController # blabla def addCategory User.find(params[:id]).categories << Category.find(params[:u

我有两种平等访问模型:用户和类别

其中每一项都应该有标准操作:索引、新建、创建、编辑、更新和销毁

但是,当我想在这两个模型之间创建关联时,我在哪里集成关联呢

我是否必须编写两次几乎相同的代码:

class UsersController << ApplicationController

  # blabla
  def addCategory
    User.find(params[:id]).categories << Category.find(params[:user_id])
  end
end

class CategoriessController << ApplicationController
  # blabla
  def addUser
    Category.find(params[:id]).users << User.find(params[:user_id])
  end
end

编辑:


我正在谈论HBTM的关系。

您没有提到您是否正在使用has\u和\u属于\u many,或者您是否正在使用has\u many:through。我推荐has_many:through,它强制您使用实际的连接模型,比如UserCategory或Categorization之类的。然后你只需要创建一个新的控制器来处理它的创建

您需要将用户和类别作为参数传递给此控制器的创建操作

你的表格。。。 @category.id),:method=>:post do%>

你的控制器

class CategorizationsController < ApplicationController
   def create
     if Categorization.add_user_to_category(params[:user_id], params[:category_id])
        ...

   end
end
当你想把用户发回时,问题就来了,但这并不难——检测他们从哪里来,然后把他们发回那里。或者将返回页放入表单上的隐藏字段中


希望能有所帮助。

如果您需要使用has\u和\u属于\u many进行此操作,您可以采用当前使用的方法,或者将其构建到现有的更新操作中

当您添加habtm关系时,您将在类上获得一个额外的方法

class User < ActiveRecord::Base
  has_and_belongs_to_many :categories
end
将设置具有这些ID的类别。如果正确命名表单字段,则如果要使用复选框或多选控件,则更新可以为您解决此问题


如果您需要一次添加一个,那么您在原始帖子中构建的方法就足够合理了。如果您认为您的重复是一种代码味道,那么您是正确的-这就是为什么您应该使用我在上一个回答中概述的方法-一个附加模型和一个附加控制器。

对不起,我正在讨论HBTM关系。如果可能的话,我建议不要这样做。不过,我会发布一个关于habtm的答案,这就是我所使用的。好的,看到了对嵌套属性的支持。。。。我认为这也有助于。。。谢谢
class CategorizationsController < ApplicationController
   def create
     if Categorization.add_user_to_category(params[:user_id], params[:category_id])
        ...

   end
end
class Categorization
   belongs_to :user
   belongs_to :category

   def self.add_user_to_category(user_id, category_id)
     # might want to validate that this user and category exist somehow
     Categorization.new(:user_id => user_id, :category_id => category_id)
     Categorization.save
   end
end
class User < ActiveRecord::Base
  has_and_belongs_to_many :categories
end
user = User.find(params[:id])
user.category_ids = [1,3,4,7,10]
user.save