尝试使用我的POST请求获取嵌套属性。
我的控制器中的create和privates方法如下所示:
def create
respond_to do |format|
format.json { head :ok }
end
Event.create!(event_params)
end
private
def event_params
#puts "**** #{params.to_yaml}"
params.require(:event).permit(:name, parameters_attributes: [:topic_name])
end
创建了一个Event实例,但参数没有。另外,我得到一个ActionController:UnknownFormat错误。私有方法看起来正确,根据我看过的嵌套属性文档,但不遵循为什么事件创建但参数不是。
Heroku日志给出了这个。
INFO -- : Parameters: {"name"=>"Topic Views", "topic_name"=>"First Topic to Prepare Bloccit for API Testing", "created_at"=>"2014-04-15 00:22:38 UTC", "event"=>{"name"=>"Topic Views", "created_at"=>"2014-04-15 00:22:38 UTC", "topic_name"=>"First Topic to Prepare Bloccit for API Testing"}}
I, [2014-04-21T05:56:08.116439 #2] INFO -- : Completed 406 Not Acceptable in 0ms
F, [2014-04-21T05:56:08.117418 #2] FATAL -- :
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/events_controller.rb:11:in `create'
更新
def create
@event = Event.create!(event_params)
@event.parameters.create!(event_params)
respond_to do |format|
format.html
format.json { head :ok }
format.js
end
end
private
def event_params
params.require(:event).permit(:name, parameters_attributes: [:topic_name])
end
答案 0 :(得分:1)
几个问题:
- 您没有传递嵌套属性
- 您在<{em}
触发create!
阻止后respond_to
方法 醇>
我首先要整理你的create
方法:
def create
event = Event.new(event_params)
event.save #-> did this for convention. You can use create! if you want!
respond_to do |format|
format.html
format.json { head: ok }
format.js
end
end
其次,您的表单未正确传递您的嵌套属性:
Parameters: {"name"=>"Topic Views", "topic_name"=>"First Topic to Prepare Bloccit for API Testing", "created_at"=>"2014-04-15 00:22:38 UTC", "event"=>{"name"=>"Topic Views", "created_at"=>"2014-04-15 00:22:38 UTC", "topic_name"=>"First Topic to Prepare Bloccit for API Testing"}}
在events
参数哈希中,你应该有paramaters_attributes:
,但你不是。这通常是由于在您触发new
方法时未构建关联的ActiveRecord对象而导致的。你需要这个:
#app/controllers/events_controller.rb
def new
@event = Event.new
@event.parameters.build
end
#app/views/events/new.html.erb
<%= form_for @event do |f| %>
<%= f.fields_for :parameters do |p| %>
<%= p.text_field :attr %>
<% end %>
<% end %>
<强>更新强>
由于您未使用accepts_nested_attributes_for
,因此您最好使用params哈希:
def event_params
params.require(:event).permit(:name, :topic_name)
end