要添加到Caillou 的答案,您还需要其他几个修复。
驼峰式
您的Tutorialcategory 模型需要被称为TutorialCategory:
#app/models/tutorial_category.rb
class TutorialCategory < ActiveRecord::Base
...
end
每当 Rails 加载模型时,它都希望其名称为 CamelCase。它将从snake_case 文件名中推断出这一点;每个下划线代表一个新的大写字母。
-
查看
为了通过has_many 关系填充category,您需要填充关联表的foreign_key:
#app/views/tutorials/new.html.erb
<%= form_for @tutorial do |f| %>
<%= f.collection_select :category_id, TutorialCategory.all, :id, :name %>
<%= f.submit %>
<% end %>
这将在数据库中设置Tutorial 对象的category_id -- 当您调用它时填充tutorial_category 关联方法:
#app/models/tutorial.rb
class Tutorial < ActiveRecord::Base
belongs_to :category, class_name: "TutorialCategory" #-> put category_id in the tutorials table
end
#app/models/tutorial_category.rb
class TutorialCategory < ActiveRecord::Base
has_many :tutorials #-> no changed needed in db
end
这就是 ActiveRecord 从相关表中提取关联对象的方式:
@tutorial = Tutorial.find x
@tutorial.category.name #-> name of category
-
别名
为防止law of demeter,您不妨使用alias_attribute 将name 委托给category:
#app/models/tutorial.rb
class Tutorial < ActiveRecord::Base
...
alias_attribute :name, to: :category, prefix: true #-> @tutorial.category_name
end
-
强参数
最后,当您升级到 Rails 4 时,您需要在控制器中使用 strong parameters。这是一个非常简单的开关:
- 从您的模型中删除
attr_accessible
- 向控制器添加“params”方法:
像这样:
#app/controllers/tutorials_controller.rb
class TutorialsController < ApplicationController
def create
@tutorial = Tutorial.new tutorial_params
@tutorial.save
end
private
def tutorial_params
params.require(:tutorial).permit(:body, :title, :tutorialcategory)
end
end