Forms 我如何在控制器和表单中为一个模型提取数据,该模型位于不同的模型中,并且没有外键关系?

Forms 我如何在控制器和表单中为一个模型提取数据,该模型位于不同的模型中,并且没有外键关系?,forms,ruby-on-rails-4,models,html-select,Forms,Ruby On Rails 4,Models,Html Select,我是rails新手,在模型之外的数据方面没有做太多工作。 我有一个引用文件表控制器的表单。我想添加一个下拉列表,它将显示项目表中的项目列表,供用户在需要时将文件分配给项目。分配项目不是一项要求。该文件可以取消分配给项目。对于分配的项目,我在文件表中确实有一个project_id列,但它允许为null,并且我没有建立关系,因为我需要有没有关系的案例 有人能告诉我怎么做吗 当他们评估文件时,屏幕上会显示一个“保存”或“更新”按钮,具体取决于该文件是否已保存在数据库中 在右边的“保存和更新”弹出窗口的

我是rails新手,在模型之外的数据方面没有做太多工作。 我有一个引用文件表控制器的表单。我想添加一个下拉列表,它将显示项目表中的项目列表,供用户在需要时将文件分配给项目。分配项目不是一项要求。该文件可以取消分配给项目。对于分配的项目,我在文件表中确实有一个project_id列,但它允许为null,并且我没有建立关系,因为我需要有没有关系的案例

有人能告诉我怎么做吗

当他们评估文件时,屏幕上会显示一个“保存”或“更新”按钮,具体取决于该文件是否已保存在数据库中

在右边的“保存和更新”弹出窗口的同时,我想显示一个带有“分配项目”按钮的项目列表框。如果是新建的,则仅更新列表,因为未分配,或者如果已分配,则在列表中显示选定值,同时允许他们根据需要从列表中更改该值

在回发到UI的文件控制器方法中,我有以下代码:

@file_alias_filedata = FileAliasFiledata.all
@projects = Project.all
<p> <label> Select Project to Assign:</label>  <br />
 <%= select_tag 'projects', (@projects.present? ? options_for_select(@projects, @selected_project) : []) %> </p> 
更新

@projects = Project.find(params[:id]) 
在表格中,我有以下代码:

@file_alias_filedata = FileAliasFiledata.all
@projects = Project.all
<p> <label> Select Project to Assign:</label>  <br />
 <%= select_tag 'projects', (@projects.present? ? options_for_select(@projects, @selected_project) : []) %> </p> 
表单运行,但我在下拉框中看到:

#<Project:0x))7ff531ab4518>
有人能帮我弄清楚如何完成我的任务,为什么我会看到奇怪的方块值吗? 我做错了什么

谢谢你的帮助

分配项目不是一项要求。可以取消分配该文件 为一个项目做准备。我在文件表中有一个project\u id列用于 已分配但允许为空的项目

从文档中:

属于\u toname,scope=nil,options={}public 指定一个 与另一个类的一对一关联。此方法仅适用于 如果此类包含外键,则使用。如果另一类 包含外键,则应改用has_one。看见 还有ActiveRecord::Associations::ClassMethods关于何时执行的概述 使用有一个,何时使用属于

将添加用于检索和查询单个关联对象的方法 对象,此对象持有其id:

associationforce_reload=false 返回关联的对象。如果没有找到,则返回nil

同样地

has_manyname,scope=nil,options={},extension-public 指定 一对多的关联。以下是检索和分析的方法 将添加关联对象集合的查询:

collectionforce_reload=false返回所有 关联对象。如果找不到空数组,则返回空数组

但是属于并且有很多人应该让事情对你更方便。您当然不必使用它们

其次,

为什么我会看到奇怪的方块值?我做错了什么

您看到奇怪的值的原因与以下两个循环显示不同的内容的原因相同:

class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

@dogs = [
  Dog.new("Sam"),
  Dog.new("Betty"),
  Dog.new("Pete"),
]

@dogs.each {|dog| puts dog}

@dog_names = @dogs.map {|dog| dog.name }
@dog_names.each {|dog_name| puts dog_name}


--output:--
#<Dog:0x0000010099a308>
#<Dog:0x0000010099a2b8>
#<Dog:0x0000010099a268>
Sam
Betty
Pete
如果在视图中执行以下操作,您将看到相同的结果:

<div>
<%= select_tag "dog", options_for_select(@dogs) %>
</div>

<div>
<%= select_tag "dog_name", options_for_select(@dog_names) %>
</div>
如果您阅读此处的文档:

…您将看到几个示例,这些示例应该清楚地表明,选项\u for \u select采用的参数是:

字符串数组。 键和值都是字符串的哈希。 迭代某些字符串的可枚举项。 等
你看到模式了吗?是弦!_select的选项_需要一个由字符串组成的参数。如果参数不是字符串的集合,例如项目对象的数组,则\u select的选项\u尝试通过调用对象上的\u s将对象转换为字符串。默认的tos方法是objecttos,它由所有对象继承,并生成一个包含类名和对象id的字符串。

我也是rails新手,但我认为您可以尝试使用来自集合的选项来选择方法

<%= select_tag :search_state, options_from_collection_for_select(State.find(:all, :select => :name), :name, :name) %>

希望这有帮助。因为它确实帮助了我。

对不起,我对你面临的确切问题感到困惑,我觉得你问了三件不同的事情。你能具体说明一下你有什么问题吗?另外,看看。如果您正在传递uncollected@projects变量,那么这就解释了您看到的奇怪文本。您需要将该数组过滤为二维数组。有关详细信息,请参阅文档。这至少可以解决这个问题。顺便说一句,你的帖子帮助我避免了麻烦,并提出了正确的问题。因此,我找到了这个答案,我认为它将帮助你。