嵌套资源的表单:不能保持关联
问题描述:
我有一个嵌套资源的表单有问题。数据模型很简单:嵌套资源的表单:不能保持关联
class Event < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
has_many :event_contents
end
class EventContent < ActiveRecord::Base
belongs_to :event
end
我的形式:
= simple_form_for([:admin, @event, @event.event_contents.new], remote: true) do |f|
.chat-form
.input-cont
= f.input :content, label: false, input_html: { class: 'form-control' }
.btn-cont
%span.arrow
= f.submit 'invia', class: 'btn blue icn-only'
控制器:
class Admin::EventContentsController < AdminController
def create
@event_content = EventContent.new event_content_params
@event_content.user_id = current_user.id if current_user
if @event_content.save
respond_to do |format|
format.js { render :nothing => true }
end
else
end
end
private
def event_content_params
params.require(:event_content).permit(
:content,
:event_id,
:user_id
)
end
end
当我在PARAMS代替事项标识提交后我有事件“蛞蝓“
pry(#<Admin::EventContentsController>)> params
=> {"utf8"=>"✓", "event_content"=>{"content"=>"uhm"}, "commit"=>"invia", "action"=>"create", "controller"=>"admin/event_contents", "event_id"=>"test-test-test"}
该记录是在db中创建,但event_id是零,所以关联被破坏。 为什么不是event_id我有事件slug ???
更新
的问题是控制器:
def create
@event = Event.find params[:event_id]
@event_content = @event.event_contents.build event_content_params
@event_content.user_id = current_user.id if current_user
if @event_content.save
respond_to do |format|
format.js
end
else
end
end
答
也许尝试执行以下操作:
-
在事件模型
- 在表单中添加
accepts_nested_attributes_for :event_contents
-
,当你正在收集:event_contents替换
f.input :content, label: false, input_html: { class: 'form-control' }
下列要求:
f.fields_for :event_contents do |content| content.input :content end
-
更新您的大力PARAMS在活动控制器包括{:event_contents_attributes}这可能看起来像下面这取决于你需要通过其他PARAMS通过:
在您的活动控制器中,更新
def new
包括此行项目event_content = @event.event_contents.build
所有这一切说,我相信你会希望这个被路由到您的活动控制器,而不是你的EventContents控制器,因为:event_contents嵌套在:事件。看起来您的表单目前正在提交给EventContents控制器。另外,我不相信你的simple_form_for @event.event_contents.new
这个参数是必要的。
这是我建立你的问题。这不是管理员名称空间,但可能会有所帮助。
class EventsController < ApplicationController
def new
@event = Event.new
event_content = @event.event_contents.build
end
def create
@event = Event.new(event_params)
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render :show, status: :created, location: @event }
format.js
else
format.html { render :new }
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
private
def event_params
params.require(:event).permit(:name, {:event_contents_attributes => [:content]})
end
end
事件模型:
class Event < ActiveRecord::Base
has_many :event_contents
accepts_nested_attributes_for :event_contents
end
最后形式:
<%= form_for(@event) do |event| %>
<div class="field">
<%= event.label :name %><br>
<%= event.text_field :name %>
</div>
<%= event.fields_for :event_contents do |content| %>
<div class="field">
<%= content.label :content %>
<%= content.text_field :content %>
</div>
<% end %>
<div class="actions">
<%= event.submit %>
</div>
<% end %>
发现问题... – 2014-09-24 07:44:01