Rails:无法保存嵌套属性

时间:2017-05-09 22:44:26

标签: ruby-on-rails

我有两个模型:User和WritingSample。用户可以有许多书写样本。我有一个带有额外JS表单的页面,用于添加额外的写入示例字段 - 但是,我暂时禁用了这个,并且我试图让它只使用它。

我想要发生的事情:用户将书写样本的网址键入表单,并将其存储为WritingSample行。

表格似乎有效。但我显然没有做对。

当我提交表单时,我可以看到safe_params包含:

"writing_samples_attributes"=><ActionController::Parameters {"0"=><ActionController::Parameters {"url"=>"foo"} permitted: true>}

但看起来用户想要一个id:

> User
User(id: integer, name: string, writing_sample_id: integer)

User.new(safe_params)返回:

<User id: nil, name: "joe", created_at: nil, updated_at: nil, writing_sample_id: nil>

新用户未创建,我收到错误:

user.errors.first
[:"writing_samples.user", "must exist"]

我需要采取哪些步骤将提交的数据存储在:url字段中?

WritingSample:

class WritingSample < ApplicationRecord
  belongs_to :user
end

用户:

class User < ApplicationRecord
  has_many :writing_samples
  accepts_nested_attributes_for :writing_samples
end

架构:

create_table "users", force: :cascade do |t|
  t.datetime "created_at",        null: false
  t.datetime "updated_at",        null: false
  t.integer  "writing_sample_id"
  t.index ["writing_sample_id"], name: "index_users_on_writing_sample_id"
end

create_table "writing_samples", force: :cascade do |t|
  t.string   "name"
  t.integer  "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string   "url"
  t.index ["user_id"], name: "index_writing_samples_on_user_id"
end

我的控制器:

def create
  user = User.new(safe_params)
  byebug
  if user.save
    redirect_to '/thanks'
  else
    byebug
    redirect_to new_creator_path
  end
end

private

def safe_params
  params.require(:user).permit(:name, :writing_samples_attributes => [:url])
end

表格:

<%= form_for(@user, url: creators_path) do |f| %>
  <%= f.label :name %>
  <%= f.label 'Writing samples' %>
  <%= f.text_field :name, class: 'form-control' %>
    <%= f.fields_for :writing_samples do |sample_f| %>
      <%= sample_f.text_field :url %>
    <% end %>
<% end %>

0 个答案:

没有答案