【问题标题】:In RoR, f.fields_for is rendering as nothing在 RoR 中,f.fields_for 渲染为空
【发布时间】:2016-07-27 14:55:56
【问题描述】:

我使用的是 Rails 4.2.7。在我的模型中,我有

class MyObject < ActiveRecord::Base
    …
  belongs_to :address, :autosave => true, dependent: :destroy

  accepts_nested_attributes_for :address, :my_object_times

和地址模型

class Address < ActiveRecord::Base
  belongs_to :state
  belongs_to :country
  ...
  has_one :my_object

end

我想写一个表单,让我可以同时构建子对象和父对象,所以我尝试了

<%= form_for @my_object, :url => my_objects_create_path, :remote => true do |f| %>

  <div class="field">
    <%= f.fields_for :address do |addr| %>
    <%= addr.label :address %> <span name="my_object[address]_errors"></span><br>
    City: <%= addr.text_field :city %>
    <%= addr.select :state, options_for_select(us_states.collect{|s| [ s.name, s.id ]}), {:prompt => "Select State"} %>
    <%= country_code_select('my_object[address]', 'country_id',
              [[ 'US', 'United States' ], [ 'CA', 'Canada' ]],
              {:include_blank=>true, :selected => @default_country_selected.id},
              {:class=>'countryField'}
              ) %>
    <% end %>
  </div>

但以上只是呈现为

<div class="field">
</div>

如何调整内容以使我的字段呈现并且我能够使用在我的控制器中创建我的对象

my_object = MyObject.new(params) 

编辑:根据给出的答案,我尝试了

@my_object.address.build

从控制器动作中渲染表单,但得到了错误

undefined method `build' for nil:NilClass

【问题讨论】:

    标签: forms ruby-on-rails-4 associations parent fields-for


    【解决方案1】:

    #这是在表单加载类中

    def new
        @myobject = MyObject.new
        @myobject.address = Address.new
    end
    

    #现在可以为地址使用嵌套属性

    <%=form_for(@myobject) do |f|%>
    <%=f.fields_for :address do |a|%>
        Your form fields here
        <%end%>
    <%end%>
    

    #this is create def

    def create 
    @myobject = MyObject.new(myobject_params)
    @myobject.save
    end
    

    #in 参数

    def myobject_params
    params.require(:myobject).permit(:some, :key,:of, :myobject, :address_attributes[:address, :attribute])
    end
    

    #这应该可以工作

    【讨论】:

    • 我在“@myobject.address.new”行收到错误“undefined method `new' for nil:NilClass”
    【解决方案2】:

    如果my_object 没有地址,则不会呈现任何内容。这是 Rails 中的默认行为。解决此问题的一种方法是在控制器中构建一个或多个空子对象,以便向用户显示至少一组字段

    Rails guides 在嵌套表单第 9.2 节中讨论了这一点

    另外,在您的 MyObject 模型中,我认为它应该是 has_one address。你有belongs_to

    class MyObject < ActiveRecord::Base
      has_one :address, :autosave => true, dependent: :destroy
      accepts_nested_attributes_for :address
    end
    

    【讨论】:

    • 我的“my_objects”表有一个链接回“addresses”表的“address_id”列。鉴于此,您仍然说关系应该是“has_*”而不是“belongs_to”吗?
    • 抱歉不知道my_object 指的是什么,我不能说你应该如何构建你的数据关联。 @my_object.address.build 给出该错误的原因是因为has_many 关联的构建器应该是@my_object.addresses.build。或者它可能是has_one。无论采用嵌套形式,子对象对belong_to 父对象都是有意义的。我不确定你是否可以让它以另一种方式工作 - 我不诚实地知道
    • 在任何情况下都可以尝试在新操作中的 my_object 控制器中使用空白的 address 实例对象以获取要呈现的表单。看看有没有帮助
    • 在 Rails 文档中——guides.rubyonrails.org/association_basics.html,Book belongs_to Author,因此“books”表有一个“author_id”。我的“my_objects”表有一个“address_id”,所以我也应该使用belongs_to,不是吗?另外,您能否举一个我将在您的其他评论中使用的代码示例来渲染该字段?
    • 是的,如果my_object 属于address,那么my_object 将有一个address_id。那是真实的。但是我要说的是,如果您将地址嵌套在 my_object 中,那么您的关联就没有意义。当您拥有 my_object accepts_nested_attributes_for 地址时,地址应该属于 my_object,而不是相反。有关示例,请参阅 Rails 文档中的 nested attributes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多