5

私は 2 つのモデルを持ってRecipeおりTaghas_and_belongs_to_many関係があります。このリレーションには、単純な結合テーブル がありRecipesTagsます。

レシピ:

has_and_belongs_to_many :tags

鬼ごっこ:

has_and_belongs_to_many :recipes

新しいレシピを作成すると、ユーザーはレシピが属するカテゴリを「肉」、「魚」などのチェックボックスの形式で入力できるようになりました。これらのカテゴリは、実際にはデータベース内の単なるタグです。

問題: レシピにタグが保存されません。

レシピnewcreateコントローラーのメソッド:

    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 method `merge' for "Meat":String

「肉」はタグ名です。

それで、私はここで何が間違っていますか?

4

2 に答える 2

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 %>
于 2013-03-03T18:39:21.490 に答える
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 %>
于 2013-03-03T18:20:26.593 に答える