2015-09-12 226 views
0

我是RoR的新手,这让我疯狂。未保存的Rails嵌套属性

我想使用嵌套属性将记录放在两张桌子上,只使用一种形式。这在教程中看起来很简单,但我做错了一些事情,无法弄清楚。 我检查了其他线程与类似的问题,没有运气。

也许你们可以帮助我。

这里是我的两个型号

class Encuesta < ActiveRecord::Base 
    has_one :encuestas_titulos_idioma, :dependent=>:destroy 
    accepts_nested_attributes_for :encuestas_titulos_idioma 
end 

class EncuestasTitulosIdioma < ActiveRecord::Base 
    belongs_to :encuestas 
end 

IHAVE还为嵌套属性的许可证。

def encuesta_params 
     params.require(:encuesta).permit(:estado, :servicio_asociado, encuestas_titulos_idiomas_attributes: [ :titulo, :descripcion, :encuesta_id ]) 
end 

这里是形式

<%= form_for(@encuesta) do |f| %> 
    <% if @encuesta.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@encuesta.errors.count, "error") %> prohibited this encuesta from being saved:</h2> 

     <ul> 
     <% @encuesta.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :estado %><br> 
    <%= f.text_field :estado %> 
    </div> 

    <div class="row"> 
    <%= f.fields_for :encuestas_titulos_idiomas do |ff| %> 
     <div class="medium-12 columns"> 
     <%= ff.label :titulo %> 
     <%= ff.text_field :titulo %> 


     </div> 
     <div class="medium-12 columns"> 
     <%= ff.label :descripcion %> 
     <%= ff.text_area :descripcion, rows: 4 %> 

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

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

任何想法有什么不好? 非常感谢。

编辑。修正:

我发现问题(和解决方案)。 这是为了万一它可以帮助某人。

在控制器行动,对于HAS_ONE协会,我们应该使用

def new 
    @encuesta = Encuesta.new 
    @encuesta.build_encuestas_titulos_idioma 
    end 

@encuesta.encuestas_titulos_idioma.build 

我们使用has_many关联。

+1

您收到了错误?如果所有数据都被发送,你可以检查控制台吗? – psantos

+0

感谢您的回复。我得到了不允许的参数:encuestas_titulos_idiomas 然后,我将名称更改为单数(以匹配accepts_nested_attributes_for参数),但错误仍然存​​在。看起来像一个命名约定的错误,但找不到它。 – Sonia

+0

变化'accepts_nested_attributes_for:encuestas_titulos_idioma'到'accepts_nested_attributes_for:encuestas_titulos_idiomas' 而我的建议是:总是使用英文名字。 – psantos

回答

0

您可以使用拐点,所以Rails会知道如何获得本次非英语单词的单数/复数

config/intializers/inflections.rb添加

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular 'singular', 'plural' 
end 
+0

谢谢bidsolom。我已经在使用它们。 – Sonia

0

问题就在这里:

params.require(:encuesta).permit(:estado, :servicio_asociado, encuestas_titulos_idiomas_attributes: [ :titulo, :descripcion, :encuesta_id ]) 

由于关联的has_one是: 因此,您必须更改,将encuestas_titulos_idiomas_attributes更改为encuestas_titulos_idioma_attributes 0(单数:idioma)。

正如说psantos:在形式上。在EncuestasTitulosIdioma类belongs_to :encuestas

编辑 我也觉得在你的岗位。这里换成belongs_to :encuesta

+0

我在发布问题之前就做了它,并且嵌套的属性字段没有显示在表单中....这让我发疯 – Sonia

+0

只要确保您在任何地方都使用'encuentas_titulos_idioma'。而不是'encuestas_titulos_idiomas' –

0

第一:

def encuesta_params 
    params.require(:encuesta).permit(:estado, :servicio_asociado, encuestas_titulos_idioma_attributes: [ :titulo, :descripcion, :encuesta_id ]) 
end 

然后:

# ... 
<%= f.fields_for :encuestas_titulos_idioma do |ff| %> 
# ... 

可以保持模型是这样的:

class Encuesta < ActiveRecord::Base 
    has_one :encuestas_titulos_idioma, :dependent=>:destroy 
    accepts_nested_attributes_for :encuestas_titulos_idioma 
end 

如果错误继续,告诉我怎样的数据正在这些变化后发送。

+0

我已经做到了。问题是,如果我在许可证和表单中都更改它,则嵌套字段不会显示在表单中。 也许我错过了我的控制器中的东西... – Sonia