【问题标题】:Not getting custom category field value未获取自定义类别字段值
【发布时间】:2015-10-29 11:18:05
【问题描述】:

在我的应用程序上,我创建了两个模型 TutorialTutorial category,对于教程,我为类别(在迁移中)“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

【问题讨论】:

  • 供参考:我使用 = @tutorial.tutorialcategory 显示类别名称
  • 你为什么还在使用 Rails 3?
  • 计划升级,2年前完成。
  • 好吧,哥,我写点东西来帮助你

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


【解决方案1】:

您似乎需要CategoryTutorial 之间的has_many 关系:

  • 删除 tutorials 表中名为“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是Tutorial的实例)和categ.tutorials(categ是Category的实例)

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

文档:

【讨论】:

    【解决方案2】:

    要添加到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_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”方法:

    像这样:

    #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
    

    【讨论】:

    • 谢谢 Rich,我想过像你这样给出更完整的答案,但我没有足够的动力:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多