我有两个模型,Recipe
和Tag
,关系为has_and_belongs_to_many
。对于这种关系,我有一个简单的连接表,RecipesTags
。
配方:
has_and_belongs_to_many :tags
标签:
has_and_belongs_to_many :recipes
现在,在创建新配方时,用户可以以复选框的形式填写配方所属的类别,例如“肉”,“鱼”等。这些类别实际上只是数据库中的标签。
问题:食谱没有保存任何标签。
配方new
和create
控制器方法:
def new
@recipe = Recipe.new
@ingredients = Ingredient.all
@tags = Tag.all
respond_to do |format|
format.html # new.html.erb
format.json { render json: @recipe }
end
end
# POST /recipes
# POST /recipes.json
def create
@recipe = Recipe.new(params[:recipe])
if (params[:tags])
@recipe.tags << params[:tags]
end
respond_to do |format|
if @recipe.save
format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' }
format.json { render json: @recipe, status: :created, location: @recipe }
else
format.html { render action: "new" }
format.json { render json: @recipe.errors, status: :unprocessable_entity }
end
end
end
观点:
<%= form_for(@recipe, :html => {:multipart => true}) do |f| %>
<% if @recipe.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@recipe.errors.count, "error") %> prohibited this recipe from being saved:</h2>
# [ fields that get's saved for the recipe and works fine ]
<% @tags.each do |t| %>
<%= f.label t.name %>
<%= f.check_box :tags, t.name %>
<br />
<% end %>
<%= f.submit 'Submit recipe', :class => 'btn btn-primary' %>
<% end %>
目前,我收到一条错误消息: undefined方法`merge'代表“Meat”:String
“Meat”是标签名称。
那么,我在这里做错了什么?
答案 0 :(得分:3)
我认为问题在于这一行@recipe.tags << params[:tags]
。
您使用<<
调用的关联方法接受一个对象(在这种情况下需要一个标记对象),但在这种情况下,您似乎可能正在传递一个字符串。
有关详细信息,此链接可能会有帮助http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference,特别是在collection<<(object, …)
引用的位置。
在您的控制器中,您需要执行@recipe.tags << tag
之类的操作,其中tag是特定的标记对象。
所以,试试这个:
在您的控制器中
params[:tags].each do |k,v|
@recipe.tags << Tag.find(k)
end
在您的视图中
<% @tags.each do |t| %>
<%= f.label t.name %>
<%= f.check_box "tags[#{t.id}]" %>
<br />
<% end %>
答案 1 :(得分:1)
试试这个:
def create
@recipe = Recipe.new(params[:recipe])
params[:tags].each do |tag|
@recipe.tags << Tag.find_by_name(tag)
end
respond_to do |format|
if @recipe.save
format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' }
format.json { render json: @recipe, status: :created, location: @recipe }
else
format.html { render action: "new" }
format.json { render json: @recipe.errors, status: :unprocessable_entity }
end
end
end
在视图中:
<% @tags.each do |t| %>
<%= label_tag t.name %>
<%= check_box_tag "tags[#{t.name}]", t.name %>
<br />
<% end %>