我有两个模型: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 %>