2

我已使用此处概述的技术 ( http://www.refinerycms.com/guides/multiple-resources-in-an-extension ) 将引擎添加到现有的炼油厂 CMS (2.0.9) 模型中。这似乎运作良好,所有页面都存在并且是可编辑的。

但是,我现在正尝试正确关联引擎中的两个模型,以便在输入新记录期间,一个模型的外键显示为下拉“名称”,而不仅仅是一个空的整数文本框。

例如,我的引擎名称是“gorts”(《地球停转之日》中的机器人)。其中两个模型是devicesensor,它们正确关联如下: \extension\gorts\models\refinery\gorts\device.rb

module Refinery
  module Gorts
    class Device < Refinery::Core::BaseModel
      attr_accessible :name, :gort_id, :picture_id, :position
      acts_as_indexed :fields => [:name]
      validates :name, :presence => true, :uniqueness => true
      belongs_to :picture, :class_name => '::Refinery::Image'
      belongs_to :gort
      has_many :sensor
    end
  end
end

sensor.rb:

module Refinery
  module Gorts
    class Sensor < Refinery::Core::BaseModel
      attr_accessible :device_id, :name, :sublocation, :sensortype, :uidval, :position
      acts_as_indexed :fields => [:name, :sublocation, :sensortype, :uidval]
      validates :name, :presence => true, :uniqueness => true
      belongs_to :device
      has_many :reading

    end
  end
end

所以,我想我需要修改传感器控制器的操作,以便它生成一个@devices变量......然后修改表单以将其转换为下拉列表应该是微不足道的。但是,我尝试的所有操作都失败或无法填充@devices。以下是我尝试过的一些事情:

首先,我尝试将其添加到gorts/admin/sensors_controller.rb

 def new
        # DC Attempting to get @devices defined so we can use for a drop-down
        logger.info("Seeding all devices from admin/sensors_controller new")
        @devices = Device.find(:all)
        super
    end

但它失败了: Refinery::Gorts::Admin::SensorsController#new super: NoMethodError in Refinery::Gorts::Admin::SensorsController:0x007f86ef471d28 没有超类方法`new'

如果我注释掉“超级”行,似乎我在某处打破了链条,因为我在表单上收到此错误: NoMethodError in Refinery/gorts/admin/sensors#new

Showing /Users/cclogicimac/rails_projects/cclogic_app/vendor/extensions/gorts/app/views/refinery/gorts/admin/sensors/_form.html.erb where line #1 raised:

undefined method `model_name' for NilClass:Class
Extracted source (around line #1):

1: <%= form_for [refinery, :gorts_admin, @sensor] do |f| -%>
2:   <%= render '/refinery/admin/error_messages',
3:               :object => @sensor,
4:               :include_object_name => true %>
Trace of template inclusion: vendor/extensions/gorts/app/views/refinery/gorts/admin/sensors/new.html.erb

所以,我尝试了一种不同的方法:修改 /gorts/sensors_controller.rb (而不是 gorts/admin...)。

所以,如果我把这段代码放在/gorts/admin/sensors_controller.rb

def new
    # DC Attempting to get @devices defined so we can use for a drop-down
    logger.info("Seeding all devices from sensors_controller new")
    @devices = Device.find(:all)
    super
end

我没有收到任何错误,但是当我到达 /views/refinery/gorts/admin/sensors/_form.html.erb 时,@devices 为零此外,我认为这段代码没有受到影响,因为我的日志语句没有出现并且评论 super 没有影响。

在精炼引擎中关联两个模型以使输入表单显示相关模型的名称而不是整数键的正确方法是什么?

如果有任何 Refinery CMS 专家可以帮助我,我将不胜感激,并且我承诺撰写有关此主题的指南并发送给 Refinery 团队以包含在他们的指南中!

谢谢!戴夫

4

1 回答 1

3

简单的方法

在:扩展/gorts/app/views/refinery/gorts/admin/sensors/_form.html.erb

只需添加:

<div class="field">
  <%= f.label :device -%>
  <%= f.select(:device_id, Refinery::Gorts::Device.all.collect {|d| [d.name, d.id] })%>
</div>

而不是您之前的文本输入。

在视图上查询设备通常是不好的做法,但是这样您就不需要更改包含 crudify 和黑魔法的默认炼油厂管理控制器

正确的方法

在:供应商/扩展/gorts/app/controllers/refinery/gorts/admin/sensors_controller.rb

module Refinery
  module Gorts
    module Admin
      class SensorsController < ::Refinery::AdminController
        before_filter :find_all_devices

        crudify :'refinery/gorts/sensors',
                :title_attribute => 'name', :xhr_paging => true

        protected

        def find_all_devices
          @devices = Refinery::Gorts::Device.all
        end

      end
    end
  end
end

在:扩展/gorts/app/views/refinery/gorts/admin/sensors/_form.html.erb

<div class="field">
  <%= f.label :device -%>
  <%= f.select(:device_id, @devices.collect {|d| [d.name, d.id] })%>
</div>
于 2012-12-20T10:32:48.830 回答