加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails为具有多对多关系的模型创建表单

发布时间:2020-12-17 02:33:54 所属栏目:百科 来源:网络整理
导读:我有两个模型,Recipe和Tag,具有has_and_belongs_to_many关系.对于这种关系,我有一个简单的连接表,RecipesTags. 食谱: has_and_belongs_to_many :tags 标签: has_and_belongs_to_many :recipes 现在,在创建新配方时,用户可以以复选框的形式填写配方所属的类
我有两个模型,Recipe和Tag,具有has_and_belongs_to_many关系.对于这种关系,我有一个简单的连接表,RecipesTags.

食谱:

has_and_belongs_to_many :tags

标签:

has_and_belongs_to_many :recipes

现在,在创建新配方时,用户可以以复选框的形式填写配方所属的类别,例如“肉”,“鱼”等.这些类别实际上只是数据库中的标签.

问题:食谱没有保存任何标签.

配方新建并创建控制器方法:

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

“肉”是标签名称.

那么,我在这里做错了什么?

解决方法

我认为问题是这行@ recipe.tags<< PARAMS [:标签].
您正在呼叫的关联方法<<接受一个对象(在这种情况下期望一个标记对象),但在这种情况下,你似乎可能正在传递一个字符串. 有关更多信息,此链接可能有用 http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference,特别是在它引用集合<<(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 %>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读