我在Rails中设置了两个模型:
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 %>
它给我错误找不到ID =“和这里相应的id”
的类别我真的很困惑,因为我按照这个教程。
我使用Rails 3.2.8
答案 0 :(得分:1)
如果没有你的观点,我不能肯定地说你要做的是什么。最重要的是,你的params [:categories]哈希是什么?鉴于名称,听起来你打算将它作为多个类别。但是,您的代码编写就好像您希望它是一组描述一个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
并且很容易。将评论跳过第三行。这可能是你绊倒的原因。
您正在为新创建的Platform
选择关联,并尝试使用存储在params[:categories]
哈希中的属性创建新类别。我担心这是不允许的。 (我认为它会引发ActiveRecord::RecordNotSaved
例外,但我可能是错的。)你不能create
@platform
尚未保留。相反,我认为你想要build
。
以下是相关文件: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
create
和build
之间的区别在于build
只是设置了关联,而实际上却没有将其保存到数据库中。 create
立即保存。关于build
的好处是你实际上不必自己保存它。当您致电@platform.save
或@platform.update_attributes
时,它会免费标记。此外,save
会自动包装在一个事务中,因此如果由于某种原因无法创建新的Category
,它就不会创建新的Platform
。
下一个有趣的事情是,您要将创建结果分配给@categories
。我不认为这也是你想要的。您无需保存新的Category
,因为它会与您的@platform
一起标记。但是,如果平台的save
失败,那么您将使用此值new
重新呈现@categories
视图,而在new
中设置@categories = Category.all
}}。在new
失败后,这肯定会导致create
视图出现混淆。
总之,我认为您的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]
不是类别属性的哈希,并且实际上是逗号分隔的类别名称字符串,那么您可能希望执行以下操作而不是上面的第二行:
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
我希望有所帮助。