强参数嵌套属性,ActionController未知格式

时间:2014-04-21 06:56:02

标签: ruby-on-rails heroku nested-attributes strong-parameters http-post

尝试使用我的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

1 个答案:

答案 0 :(得分:1)

几个问题:

  
      
  1. 您没有传递嵌套属性
  2.   
  3. 您在<{em} create!阻止后
  4. 触发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