我有两个问题。
我有一个场景,我在一个页面上渲染多个表单,我需要能够为它们分配唯一的ID,即使在发生验证错误时也将保持分配(我试图避免使用新的实例)表单每次都会呈现不同的ID)
首先我有这3个模型
class Skill < ActiveRecord::Base
has_many :documents
end
class User < ActiveRecord::Base
has_many :documents
end
class Document < ActiveRecord::Base
mount_uploader :media, MediaUploader
belongs_to :user
belongs_to :skill
validates_presence_of :media, message: 'At least 1 File is required'
end
所以在我的页面上我会渲染多种技能,每种技能都可以有一个文档(实际上最多三个)。所以每种技能都有自己的形式
class PublicController < ApplicationController
def index
@skills = Skill.all
end
end
public / index查看
<% @skills.group_by(&:year_group_name).each do |key, value| %>
<%= key %>
<% value.group_by(&:element_name).each do |key_one, value_one| %>
<%= key_one %>
<% value_one.each do |s| %>
<% document = current_user.documents.where(skill_id: s.id ) %>
<%= s.skill_description %>
<% if document %>
<% document.each do |doc| %>
<%= doc %>
<% end %>
<%= render template: '/documents/new' %>
<% else %>
<%= render template: '/documents/new' %>
<% end %>
<% end %>
<% end %>
文件/新
<% object = @document || Document.new %>
<%if object.errors.any? %>
<h2><%= pluralize(object.errors.count, "error") %> prohibited this record from being saved</h2>
<ul class="error_list">
<% object.errors.full_messages.each do |msg| %>
<li><%= error_edit(msg) %></li>
<% end %>
</ul>
<% end %>
<%= form_for object, :html => { multipart: true, id: object.object_id.to_s, class: 'upload_document' } do |f| %>
<%= f.hidden_field :skill_id, class: 'skill_id' %>
<%= f.label :media %>
<%= f.file_field :media %>
<%= f.submit 'Upload' %>
<% end %>
所以目前我正在使用object_id返回对象的整数标识符。虽然这确实为每个表单提供了一个唯一的id,但是当验证失败时它们会在呈现新对象时发生更改
我想到了两种可能的方法,
这样即使验证失败,id也会保持一致。
我在实现这个方面遇到了一些麻烦,我似乎无法在我的form_for中访问Skill.id,而@document
就像这样抛出unable to find document with id =
class PublicController < ApplicationController
def index
@skills = Skill.all
@document = Document.find(params[:id])
end
有一种情况我可以将@ document.id分配给有记录的表单,但我不得不对其进行硬编码,这显然不太好
情景1
class PublicController < ApplicationController
def index
@skills = Skill.all
@document = Document.find(1)
end
<%= form_for object, :html => { multipart: true, id: object.id, class: 'upload_document' } do |f| %>
因此,这将为我的所有表单分配id为1。我可以采取什么方法?