为新的Rails表单创建唯一的ID

时间:2015-01-29 19:40:07

标签: ruby-on-rails ruby forms ruby-on-rails-4

我有两个问题。

我有一个场景,我在一个页面上渲染多个表单,我需要能够为它们分配唯一的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,但是当验证失败时它们会在呈现新对象时发生更改

我想到了两种可能的方法,

  1. 如果存在对象(例如@document的实例),则使用其id
  2. 如果是新实例,请指定表单所在的技能ID。
  3. 这样即使验证失败,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。我可以采取什么方法?

0 个答案:

没有答案