Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 On Rails 3 - Fatal编程技术网

Ruby on rails 在访问两个模型的一个控制器中创建逻辑

Ruby on rails 在访问两个模型的一个控制器中创建逻辑,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有三个模型,Artwork、ArtworkTag和Tag,其中ArtworkTag表示Artwork和Tag之间的m:n关系标签仅存储标签名称,即:标签 从artworktags控制器创建标记时,首先需要查看:tag是否存在于tags表中,如果不存在则创建它,然后使用标记id在ArtworkTag中建立关系 下面你可以看到我直接从这个控制器调用标签,我认为这不是正确的做法 我应该如何恰当地分离关注点来处理这种情况 def create tag = params[:artwork_tag][

我有三个模型,
Artwork
ArtworkTag
Tag
,其中
ArtworkTag
表示
Artwork
Tag
之间的m:n关系<代码>标签仅存储标签名称,即
:标签

artworktags控制器
创建标记时,首先需要查看
:tag
是否存在于
tags
表中,如果不存在则创建它,然后使用标记
id
ArtworkTag
中建立关系

下面你可以看到我直接从这个控制器调用
标签
,我认为这不是正确的做法

我应该如何恰当地分离关注点来处理这种情况

def create
  tag = params[:artwork_tag][:tag].downcase
  @tag = Tag.find_by_tag(tag)

  if @tag.blank?
    @tag = Tag.new(:tag => tag)
    @tag.save
  end

  artwork_id = params[:artwork_tag][:artwork_id]
  user_id = params[:artwork_tag][:user_id]

  artwork_tag = {
    "tag_id" => @tag.id,
    "artwork_id" => artwork_id,
    "user_id" => user_id
  }

  @artwork_tag = ArtworkTag.new(:tag_id => @tag.id, :artwork_id => artwork_id, :user_id => user_id)
  @artwork_tag.save
  respond_to do |format|
    format.json { render :json => {
      "id" => @artwork_tag.id, "tag" => @tag.tag, "artwork_id" => artwork_id },
      :status => :created }
  end
end

我不确定我是否理解您的问题,但您可以使用
first\u或\u create
方法检查记录是否已存在,如果不存在,它将创建新记录。您可以将其替换为:

@tag = Tag.find_by_tag(tag)

if @tag.blank?
  @tag = Tag.new(:tag => tag)
  @tag.save
end
只有一行:(我不使用实例变量,因为我认为您不需要在视图中使用它,只要将其更改为
@tag
,并在参数中更改为
tag\u id:@tag.id

我看到您定义了
artwork\u tag
,但为什么不使用它呢?我认为你可以取代:

artwork_tag = {
  "tag_id" => @tag.id,
  "artwork_id" => artwork_id,
  "user_id" => user_id
}

@artwork_tag = ArtworkTag.new(:tag_id => @tag.id, :artwork_id => artwork_id, :user_id => user_id)
@artwork_tag.save
使用此代码:

params = { artwork_tag: { 
                          tag_id: tag.id, 
                          artwork_id: artwork_id, 
                          user_id: user_id  } }
@artwork_tag = ArtworkTag.create(params[:artwork_tag])

我会这样做:

def create
  artwork_tag = ArtworkTag.create(
    :tag => Tag.find_or_create_by_tag(params[:artwork_tag][:tag].downcase),
    :artwork_id => params[:artwork_tag][:artwork_id],
    :user_id => params[:artwork_tag][:user_id]
  )

  respond_to do |format|
    format.json { render :json => { :artwork_tag => artwork_tag } }
  end
end

当然,我没有办法测试这一点,但这在功能上应该与您的问题中的相同。这很好,尽管当我在控制器顶部添加CanCan的
load_和\u Authorization_资源时,我得到
ActiveModel::MassAssignmentSecurity::Error(无法批量分配受保护的属性:标记):
。有什么想法吗?是的。在
app/models/artwork\u tag.rb
中,将
attr\u accessible:tag
添加到模型顶部,与第二行类似,就在类定义之后。你可能想读一点关于批量分配的内容,因为这可能不是你唯一需要一个
attr\u可访问的
才能让它工作的地方。
def create
  artwork_tag = ArtworkTag.create(
    :tag => Tag.find_or_create_by_tag(params[:artwork_tag][:tag].downcase),
    :artwork_id => params[:artwork_tag][:artwork_id],
    :user_id => params[:artwork_tag][:user_id]
  )

  respond_to do |format|
    format.json { render :json => { :artwork_tag => artwork_tag } }
  end
end