没有获得自定义类别字段值

时间:2015-10-29 11:18:05

标签: ruby-on-rails ruby-on-rails-3 model

在我的应用程序中,我创建了两个模型教程教程类别,对于教程,我已经为类别(在迁移中)'tutorialcategory'创建了一个字符串字段。

在教程添加页面上,我添加了一个选择框字段来选择类别,它正确保存(我希望),因为我可以在显示页面中保存教程后看到该值。但是当我看到使用json渲染的完整列表时,我看不到那里的值。

注意:两个模型都是独立的,其中没有一个包含迁移中的参考字段

模型代码如下

class Tutorialcategory < ActiveRecord::Base
    attr_accessible :title

    def to_param
        "#{id}-#{title}"
    end
end



class Tutorial < ActiveRecord::Base
  attr_accessible :body, :projectcategory, :rating, :title, :tutorialcategory, :videoid
end

2 个答案:

答案 0 :(得分:3)

您似乎需要在has_manyCategory之间建立Tutorial关系:

  • 删除教程表中名为“tutorialcategory”的字符串字段,创建一个名为tutorial_category_id的字段(按惯例),该字段将引用TutorialCategory的ID。

  • 在模型中,设置has_many / belongs_to关联:

    class Tutorialcategory < ActiveRecord::Base
      has_many :tutorials
    end
    
    class Tutorial < ActiveRecord::Base
      belongs_to :tutorial_category
    end
    
  • 然后您可以访问tuto.tutorial_category(tuto是教程的实例),categ.tutorials(Categ是类别的实例)

  • 当然,您需要重做界面以通过其ID保存教程类别。

文档:

答案 1 :(得分:2)

要添加到Caillou的答案,您还需要其他一些修补程序。

<强>驼峰

您的Tutorialcategory模型需要调用TutorialCategory

#app/models/tutorial_category.rb
class TutorialCategory < ActiveRecord::Base
  ...
end

每当Rails加载模型时,它的名称都应为CamelCase。它会从snake_case文件名中推断出来;每个下划线代表一个新的大写字母。

-

查看

要通过category关系填充has_many,您需要填充关联表格的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 %>

这将设置数据库中category_id对象的Tutorial - 在调用它时填充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

enter image description here

这是ActiveRecord从相关表中提取关联对象的方式:

@tutorial = Tutorial.find x
@tutorial.category.name #-> name of category

-

<强>别名

要阻止law of demeter,您可以使用alias_attributename委托给category

#app/models/tutorial.rb
class Tutorial < ActiveRecord::Base
   ...
   alias_attribute :name, to: :category, prefix: true #-> @tutorial.category_name
end

-

强大的参数

最后,当您升级到Rails 4时,您需要在控制器中使用strong parameters。这是一个非常简单的开关:

  1. 从模型中删除attr_accessible
  2. 向控制器添加“params”方法:
  3. 像这样:

    #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