我已使用此处概述的技术 ( http://www.refinerycms.com/guides/multiple-resources-in-an-extension ) 将引擎添加到现有的炼油厂 CMS (2.0.9) 模型中。这似乎运作良好,所有页面都存在并且是可编辑的。
但是,我现在正尝试正确关联引擎中的两个模型,以便在输入新记录期间,一个模型的外键显示为下拉“名称”,而不仅仅是一个空的整数文本框。
例如,我的引擎名称是“gorts”(《地球停转之日》中的机器人)。其中两个模型是device和sensor,它们正确关联如下: \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 团队以包含在他们的指南中!
谢谢!戴夫