gpt4 book ai didi

ruby-on-rails-3 - Refinery CMS - 将发动机中的两个模型连接起来的正确技术?

转载 作者:行者123 更新时间:2023-12-04 05:19:26 25 4
gpt4 key购买 nike

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

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

例如,我的引擎名称是“gorts”(“地球停转之日”中的机器人)。其中两个型号是 设备 传感器 ,它们的关系如下:
\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

传感器.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

所以,我想我需要修改传感器 Controller 新品 操作,以便它生成 @设备 变量...然后修改表单以将其转换为下拉列表应该是微不足道的。但是,我尝试的所有操作要么失败,要么无法填充@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 中的 NoMethodError
super: Refinery::Gorts::Admin::SensorsController:0x007f86ef471d28
没有父类(super class)方法`new'

如果我注释掉“ super ”行,似乎我在某处破坏了链条,因为我在表单上收到此错误:
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

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

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

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

谢谢!
戴夫

最佳答案

简单的方法

在:扩展/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>

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

在 View 上查询设备通常是不好的做法,但这样你就不需要更改包含 crudify 和 black magic 的默认精炼管理 Controller

正确的方法

在: 供应商/扩展/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>

关于ruby-on-rails-3 - Refinery CMS - 将发动机中的两个模型连接起来的正确技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com