如何获取从 Rails 中另一个模型链接的模型名称?



我在 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  %>

它给我错误找不到 id = 的类别"和这里的相应 id">

我真的很困惑,因为我遵循了本教程。

我使用 Rails 3.2.8

没有你的观点,我不能确定你到底想做什么。最重要的是,你的参数[: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

createbuild之间的区别在于,build只是设置关联,而没有实际将其保存到数据库中。create立即保存它。build的好处是,您实际上不必自己保存它。当您拨打@platform.save@platform.update_attributes时,它会免费标记。此外,save会自动包装在事务中,因此如果由于任何原因未能创建新Platform,它将不会创建新Category

下一个有趣的事情是,您将创建的结果分配给@categories。我也不认为这是你想要的。您无需保存新Category,因为它会与您的@platform一起标记。但是,如果平台的save失败,那么您将使用此值@categories重新呈现您的new视图,而new中您将@categories = Category.all.这肯定会在失败create后对new视图造成一些混淆。

总之,我认为您的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

我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新