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