ruby-on-rails – Rails 4 has_one协会形式没有建立

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails 4 has_one协会形式没有建立前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一些关于Rails 4如何与has_one和belongs_to关联的指针.

我的表单不保存has_one关系

后模型

class Post < ActiveRecord::Base
  validates: :body,presence: true

  has_one :category,dependent: :destroy
  accepts_nested_attributes_for :category
end

class Category < ActiveRecord::Base
  validates :title,presence: true
  belongs_to :post
end

后控制器

class PostController < ApplicationController
  def new
    @post = Post.new
    @post.build_category
  end

  def create
    @post = Post.new(post_params)
  end

  private

  def post_params
    params.require(:post).permit(:body)
  end
end

形式在Post#新的动作

<%= form_for @post do |form| %>

  <%= form.label :body %>
  <%= form.text_area :body %>

  <%= fields_for :category do |category_fields| %>
    <%= category_fields.label :title %>
    <%= category_fields.text_field :title %>
  <% end %>

  <%= form.button "Add Post" %>

<% end %>

Post表单提交时不保存类别标题.

调试参数

utf8: ✓
authenticity_token: 08/I6MsYjNUhzg4W+9SWuvXbSdN7WX2x6l2TmNwRl40=
post: !ruby/hash:ActionController::Parameters
  body: 'The best ice cream sandwich ever'
category: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  title: 'Cold Treats'
button: ''
action: create
controller: posts

应用程式日志

Processing by BusinessesController#create as HTML
  Parameters: {"utf8"=>"✓","authenticity_token"=>"08/I6MsYjNUhzg4W+9SWuvXbSdN7WX2x6l2TmNwRl40=","post"=>{"body"=>"The best ice cream sandwich ever"},"category"=>{"title"=>"Cold Treats","button"=>""}

在Rails控制台中我可以成功运行以下操作

> a = Post.new
=> #<Post id: nil,body: "">
> a.category
=> nil

> b = Post.new
=> #<Post id: nil,body: "">
> b.build_category
=> #<Post id: nil,title: nil>
> b.body = "The best ice cream sandwich ever"
=> "The best ice cream sandwich ever"
> b.category.title = "Cold Treats"
=> "Cold Treats"

我有关于如何解决这个问题的问题:

>我不知道我是否添加了post_params强参数方法中的category_attributes?
>日志和调试参数应该显示Category属性
是否嵌套在Post参数中?
>在类别哈希参数中有一个空白的按钮键不在我的fields_for中,我在使用表单帮助时缺少一些东西?
是因为创建动作不采取的原因
build_category方法,我将需要添加到创建
行动?
>对类别模型(存在:真实)的验证是
自动使用Post表格?

提前致谢.

更新:在fields_for块中缺少category_fields.

解决方法

问题1:是的,您需要在post_params强参数方法添加:category_attributes,如下所示:
def post_params
  params.require(:post).permit(:body,category_attributes: [:title])
end

问题#2:是的,这些参数应该是嵌套的,这是你的视图中的一个打字错误,因为你没有在父窗体构建器的范围内应用fields_for(复数形式),你也没有使用category_fields窗体构建器里面的fields_for块

视图应如下所示:

<%= form_for @post do |form| %>

  <%= form.label :body %>
  <%= form.text_area :body %>

  <%= form.fields_for :category do |category_fields| %>
    <%= category_fields.label :title %>
    <%= category_fields.text_field :title %>
  <% end %>

  <%= form.button "Add Post" %>

<% end %>

问题#3:由于您的视图中混合的表单构建,按钮参数可能位于错误的位置.

问题#4:如果您接受嵌套属性,则不需要在创建操作中构建子模型

问题#5:是的,也运行子模型的验证,如果子进程的验证失败,父进程也会有错误,不会保存到数据库中.

猜你在找的Ruby相关文章