首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 4 has_one关联表单未生成

Rails 4 has_one关联表单未生成
EN

Stack Overflow用户
提问于 2013-11-06 03:46:01
回答 2查看 12.2K关注 0票数 14

我需要一些关于Rails 4如何使用has_one和belongs_to关联的提示。

我的表单没有保存has_one关系

Post模型

代码语言:javascript
运行
复制
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

后控制器

代码语言:javascript
运行
复制
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#new action

代码语言:javascript
运行
复制
<%= 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表单提交时,它不会保存category标题。

Debug params

代码语言:javascript
运行
复制
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

应用程序日志

代码语言:javascript
运行
复制
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控制台..。我可以成功地运行以下命令

代码语言:javascript
运行
复制
> 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"

我要问的问题是如何处理这个问题:

  1. 我不确定是否必须在:category_attributes强参数方法中添加post_params
  2. 日志和调试参数是否应该显示Category属性嵌套在Post参数中?
  3. Category哈希参数中,有一个空白的button键,它不在我的fields_for中,我在使用表单助手时遗漏了什么吗?
  4. 是因为create操作没有接受build_category方法,我需要将它添加到create操作中吗?
  5. Category模型(presence: true)上的验证会自动在Post表单上使用吗?

提前谢谢。

更新:在category_fields块中缺少fields_for

EN

Stack Overflow用户

回答已采纳

发布于 2013-11-06 04:06:53

问题1:是的,您需要在post_params强参数方法中添加:category_attributes,如下所示:

代码语言:javascript
运行
复制
def post_params
  params.require(:post).permit(:body, category_attributes: [:title])
end

问题2:是的,参数应该是嵌套的,这是您的视图中的一个错误,因为您没有在父表单生成器的作用域中应用fields_for (顺便说一句复数),也没有在fields_for块中使用category_fields表单生成器!

视图应该如下所示:

代码语言:javascript
运行
复制
<%= 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:是的,子模型的验证也会运行,如果子模型验证失败,父服务器也会出现错误,并且不会保存到数据库中。

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

https://stackoverflow.com/questions/19803711

复制
相关文章

相似问题

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