首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails - fields_for和javascript用于动态添加和删除表单中的字段(railscasts )。196-197)

Rails - fields_for和javascript用于动态添加和删除表单中的字段(railscasts )。196-197)
EN

Stack Overflow用户
提问于 2014-08-31 01:05:00
回答 1查看 6.2K关注 0票数 3

更新

谢谢你的回答。

但如果我把

代码语言:javascript
复制
for requested_role in @project.requested_roles

从部分中,我无法访问requested_role.role值,因为我没有从代码中获得参数X

代码语言:javascript
复制
for X in @projects.requested_roles 

我不能写X.role

如何在不使用for或.each滚动项目的requested_roles的情况下访问此值?

端更新

我用Rails开发的社交网络有一个问题。我按照铁路196197创建了一个使用fields_for创建的表单,并使用javascript以极小的方式添加了字段,但我遇到了两个主要问题。

用户可以创建一个项目,该项目必须有1+ Requested_roles。当我打开项目编辑页面以更改角色时,如果项目有N个requested_roles,则会看到N*N个表单来更改requested_roles。因此,如果我有两个requested_roles (例如,导演和生产者),我看到4个选择字段,导演-生产者-导演-Producer。它们被重复N次。我不能修改他们,因为我可以有最大1 requested_role的每种类型。如果我只有一个requested_role (因为1x1=1),那就好了。

Project.rb

代码语言:javascript
复制
class Project < ActiveRecord::Base
attr_accessible :title, :requested_roles_attributes, :video, :num_followers, :num_likes

belongs_to :user

has_many :requested_roles, dependent: :destroy
accepts_nested_attributes_for :requested_roles, :reject_if => lambda { |a| a[:ruolo].blank? }, :allow_destroy => true

Requested_role.rb

代码语言:javascript
复制
class RequestedRole < ActiveRecord::Base
attr_accessible :role, :project_id 

belongs_to :project

Projects_controller.rb

代码语言:javascript
复制
class ProjectsController < ApplicationController

def new
  @project= Project.new
  @requested_role= @project.requested_roles.build    
end   

项目/ed.html.erb

代码语言:javascript
复制
<div class="row">
 <div class="span6 offset3">
  <%= form_for(@project) do |f| %>
    <%= render 'shared/error_messages', object: f.object%> 

    <%= f.label :title, "Project title" %>
    <%= f.text_field :title %>

    <%= f.fields_for :requested_roles do |builder| %>
          ciao
         <%= render 'requested_role', :f => builder   %>

    <% end %>

    <div class="fields">
    <p><%= link_to_add_fields "Add requested role", f, :requested_roles %></p>
    </div>

    </br>

    <%= f.submit 'Apply changes', class: 'btn btn-large btn-primary' %>

  <% end %>
</div>
</div>

我认为错误在这个视图中(项目/编辑):

代码语言:javascript
复制
    <%= f.fields_for :requested_roles do |builder| %>
          ciao
         <%= render 'requested_role', :f => builder   %>
    <% end %>

这段代码即使没有部分,也会导致N次重复的requested_roles.事实上,没有部分的_requested_role,我们有N "ciao",但我们应该只有一个。

projects/_requested_role.html.erb

代码语言:javascript
复制
<% if @project.requested_roles.any? %>
    <p>Modifica ruoli richiesti </p>
<%end%>
<%= @project.requested_roles.count %>
<% for requested_role in @project.requested_roles %>
    <div class="fields">

    <p>
    <p>Requested role: <%= role_to_string(requested_role.role) %></p>

    <%= f.label :role, "Modify role" %>
    <%= f.select :role, options_for_select([["Regista",1],["Sceneggiatore", 2],["Direttore della fotografia", 3], ["Operatore",4],
                                      ["Fonico", 5], ["Montatore", 6], ["Truccatrice",7], ["Costumista",8], ["VFX Artist",9],
                                      ["Produttore", 10], ["Attore",11], ["Attrice",12], ["Grip/Runner",13]], :selected => requested_role.role) %>


    <%= link_to_remove_fields "remove", f %>    #dinamically remove a field
    </p>

<% end %>

</div>

你能帮帮我吗?我不知道错误在哪里。提前谢谢你。

另一个问题与requested_roles (Javascript)的链接有关。

如果我有3个requested_roles (由于前面提到的错误,有9个选择字段而不是3个),并且我删除了最后一个字段(通过link_to_remove_fields),那么没有问题。但是,如果我删除第一个,字段,甚至在它下面的提交按钮消失,我不能修改角色或提交更改。

当我添加(通过link_to_add_fields)一个新角色,并且我已经有了2 requested_roles (导演,生产者)时,当我点击链接来添加新的requested_role时,又出现了另一个bug。而不是要选择角色的select字段,而是出现两个现有的select字段(导演、生产者)的副本。

application_helper.rb

代码语言:javascript
复制
def link_to_remove_fields(name, f)
  f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
end


def link_to_add_fields(name, f, association)
  new_object = f.object.class.reflect_on_association(association).klass.new
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
    render(association.to_s.singularize, :f => builder)
  end
  link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
end

Application.js

代码语言:javascript
复制
function remove_fields(link) {
    $(link).prev("input[type=hidden]").val("1");
    $(link).closest(".fields").hide();
}


function add_fields(link, association, content) {
    var new_id = new Date().getTime();
    var regexp = new RegExp("new_" + association, "g")
    $(link).parent().before(content.replace(regexp, new_id));
}

我不明白出了什么问题。如果你有什么想法,你能给我一些建议吗?非常感谢。

达里奥

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-31 03:37:06

问题是你重复了两次。

代码语言:javascript
复制
<%= f.fields_for :requested_roles do |builder| %>
  ciao
  <%= render 'requested_role', :f => builder   %>
<% end %>

将自动对每个请求角色重复requested_role部分。这就是为什么它显示"ciao“N次的原因,因为这是fields_for在呈现时所做的。您可能需要阅读文档才能了解它是如何工作的:

所以没有必要

代码语言:javascript
复制
for requested_role in @project.requested_roles

在你的部分。每次fields_for呈现时,它只会重复所有请求的角色。下面是您的代码在edit.html.erb中的样子:

代码语言:javascript
复制
<% if @project.requested_roles.any? %>
  <p>Modifica ruoli richiesti </p>
<%end%>

<%= @project.requested_roles.count %>

<%= f.fields_for :requested_roles do |builder| %>
   <%= render 'requested_role', :f => builder   %>
<% end %>

<p><%= link_to_add_fields "Add requested role", f, :requested_roles %></p>

requested_role部分应该简单地是:

代码语言:javascript
复制
<div class="fields">
  <div>
    <p>Requested role: <%= role_to_string(f.object.role) %></p>

    <%= f.label :role, "Modify role" %>
    <%= f.select :role, options_for_select([["Regista",1],["Sceneggiatore", 2],["Direttore della fotografia", 3], ["Operatore",4],
                                  ["Fonico", 5], ["Montatore", 6], ["Truccatrice",7], ["Costumista",8], ["VFX Artist",9],
                                  ["Produttore", 10], ["Attore",11], ["Attrice",12], ["Grip/Runner",13]], :selected => f.object.role) %>


    <%= link_to_remove_fields "remove", f %>
  </div>
</div>

修复你的部分应该用链接解决你的第二个问题。

您可能想考虑在nested_forms中使用Ryan的gem

表格

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25588101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档