0

Rails で 2 つのモデルをセットアップしました。

class Category < ActiveRecord::Base
  attr_accessible :name
  has_many :platforms
end

class Platform < ActiveRecord::Base
    attr_accessible :name, :url, :country
    validates :name, :presence => true, :length => { :minimum => 5 }
    validates :url, :presence => true, :length => { :minimum => 5 }
    belongs_to  :categories
end

これは私のプラットフォームコントローラーです:

class PlatformsController < ApplicationController
  # GET /platforms
  # GET /platforms.json
  def index
    @platforms = Platform.all
    @categories = Category.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @platforms }
    end
  end

  # GET /platforms/1
  # GET /platforms/1.json
  def show
    @platform = Platform.find(params[:id])
    @categories = Platform.categories

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @platform }
    end
  end

  # GET /platforms/new
  # GET /platforms/new.json
  def new
    @platform = Platform.new
    @categories = Category.all

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @platform }
    end
  end

  # GET /platforms/1/edit
  def edit
    @platform = Platform.find(params[:id])
    @categories = Category.find(:all)
  end

  # POST /platforms
  # POST /platforms.json
  def create
    @platform = Platform.new(params[:platform])
    #@categories = Category.new(params[:name])
    @categories = @platform.categories.create(params[:categories])

    respond_to do |format|
      if @platform.save
        format.html { redirect_to @platform, notice: 'Platform was successfully created.' }
        format.json { render json: @platform, status: :created, location: @platform }
      else
        format.html { render action: "new" }
        format.json { render json: @platform.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /platforms/1
  # PUT /platforms/1.json
  def update
    @platform = Platform.find(params[:id])
    @categories = Category.find(:all)

    respond_to do |format|
      if @platform.update_attributes(params[:platform])
        format.html { redirect_to @platform, notice: 'Platform was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @platform.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /platforms/1
  # DELETE /platforms/1.json
  def destroy
    @platform = Platform.find(params[:id])
    @platform.destroy

    respond_to do |format|
      format.html { redirect_to platforms_url }
      format.json { head :no_content }
    end
  end
end

何が間違っているのかわかりませんが、使用しようとすると、カテゴリがプラットフォームに正しく割り当てられず、プラットフォームのインデックス ビューにも割り当てられません。

<%= platform.categories  %>

それは私にエラーを与えます

このチュートリアルに従ったので、私は本当に混乱しています。

Rails 3.2.8を使用しています

4

1 に答える 1

1

あなたの見解がなければ、あなたが何をしようとしているのか正確にはわかりません. 最も重要なことは、params[:categories] ハッシュに何が含まれているかです。名前を考えると、複数のカテゴリを意図しているように聞こえます。ただし、コードは、1 つのCategory.

あなたが何をしたいのかはっきりとは言えませんので、あなた何をしているのかを説明することであなたの質問に答えます。多分それはあなたがそれを修正する方法を理解するのに役立つでしょう.

現在create、コードは次のようになっています。

# POST /platforms
# POST /platforms.json
def create
  @platform = Platform.new(params[:platform])
  #@categories = Category.new(params[:name])
  @categories = @platform.categories.create(params[:categories])

最初の行は新しいPlatformものを作成し、簡単です。コメントを 3 行目にスキップします。これはおそらくあなたをつまずかせているものです。

新しく作成した関連付けを選択し、ハッシュPlatformに保存されている属性を使用して新しいカテゴリを作成しようとしています。params[:categories]これは許可されていません。ActiveRecord::RecordNotSaved(例外がスローされると思いますが、間違っている可能性があります。)まだ永続化されていないcreateaにはできません。@platform代わりに、私はあなたが欲しいと思いますbuild

関連ドキュメントは次のとおりです: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

との違いはcreate、実際にはまだデータベースに保存せずに関連付けを設定するだけでbuildあることです。すぐに保存します。良い点は、実際に自分で保存する必要がないことです。またはを呼び出すと、無料でタグ付けされます。また、自動的にトランザクションにラップされるため、何らかの理由で新しい作成に失敗した場合、新しい作成は行われません。buildcreatebuild@platform.save@platform.update_attributessaveCategoryPlatform

次に興味深いのは、作成の結果を に割り当てていることです@categories。これもあなたが望むものではないと思います。Categoryと一緒にタグ付けされるため、新しいものを保存する必要はありません@platform。ただし、プラットフォームの が失敗した場合は、設定したwhileの値を使用してビューsaveを再レンダリングします。これにより、 が失敗した後にビューに混乱が生じる可能性があります。new@categoriesnew@categories = Category.allnewcreate

要約すると、createコードは次のようになるはずです。

# POST /platforms
# POST /platforms.json
def create
  @platform = Platform.new(params[:platform])
  @platform.categories.build(params[:categories])

  respond_to do |format|
    if @platform.save
      format.html { redirect_to @platform, notice: 'Platform was successfully created.' }
      format.json { render json: @platform, status: :created, location: @platform }
    else
      @categories = Category.all
      format.html { render action: "new" }
      format.json { render json: @platform.errors, status: :unprocessable_entity }
    end
  end
end

params[:categories]カテゴリ属性のハッシュではなく、実際にはカテゴリ名のコンマ区切り文字列である場合は、上記の 2 行目の代わりに次のようにする必要があります。

params[:categories].split(",").each do |category|
  @project.categories.build(name: category)
end

accepts_nested_attributes_forまた、コントローラーをさらに乾燥させることができるもの を確認することもできます. http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

それが役立つことを願っています。

于 2012-12-05T00:42:46.733 に答える