Rails - 5:如何将数组(has_many关联)传递给控制器​​操作

时间:2017-04-25 08:09:33

标签: ruby-on-rails

我有一个模型event和另一个模型event_rule

class Event < ApplicationRecord
    has_many :event_rules
end

class EventRule < ApplicationRecord
    belongs_to :event
end

我为保存活动编写了一个api event#create。这是POST请求的主体:

{
    "name": "asd",
    "code": "ad",
    "isActive": true,
    "description": "asd",
    "notes": "",
    "goalAmount": 0,
    "exportId": "",
    "defaultCurrency": 1,
    "eventStartDate": "2017-04-25T18:30:00.000Z",
    "eventEndDate": "2017-04-27T18:30:00.000Z",
    "eventRules": [
        {
            "extraInformation": "{}",
            "lookupKeyValuePairId": 40
        }
     ]
 }

这是params哈希:

Parameters: {"name"=>"asd", "code"=>"ad", "is_active"=>true, "description"=>"asd", "notes"=>"", "goal_amount"=>0, "export_id"=>"", "default_currency"=>1, "event_start_date"=>"2017-04-25T18:30:00.000Z", "event_end_date"=>"2017-04-27T18:30:00.000Z", "event_rules"=>[{"extra_information"=>"{}", "lookup_key_value_pair_id"=>40}], "client_id"=>"0", "event"=>{"name"=>"asd", "code"=>"ad", "description"=>"asd", "is_active"=>true, "goal_amount"=>0, "export_id"=>"", "event_start_date"=>"2017-04-25T18:30:00.000Z", "event_end_date"=>"2017-04-27T18:30:00.000Z", "default_currency"=>1, "notes"=>""}}

我希望'event_rules'包含在event内。怎么办呢?

1 个答案:

答案 0 :(得分:0)

def create
  # initialize Event object with `event_params`
  event = Event.new(event_params)

  # initialize EventRule object per each `event_rule_params`, and associate the EventRule as part of `event.event_rules`
  event_rules_params.each do |event_rule_params|
    event.event_rules << EventRule.new(event_rule_params)
  end

  if event.save
    # SUCCESS
  else
    # FAILURE
  end
end

private

def event_params
  params.require(:event).permit(:name, :code, :is_active, :description, :notes, :goal_amount, :export_id, :default_currency, :event_start_date, :event_end_date, :notes)
end

def event_rules_params
  params.require(:event).fetch(:event_rules, []).permit(:extra_information, :lookup_key_value_pair_id)
end

替代Rails-way解决方案:

如果您可以控制发送的参数,请将您的请求重新格式化为以下内容(请注意将event_rules更改为event_rules_attributes - Rails标准版)(More Info Here)

Parameters: {
  "event"=>{
    "name"=>"asd",
    "code"=>"ad",
    "description"=>"asd",
    "is_active"=>true,
    "goal_amount"=>0,
    "export_id"=>"",
    "event_start_date"=>"2017-04-25T18:30:00.000Z", 
    "event_end_date"=>"2017-04-27T18:30:00.000Z",
    "default_currency"=>1,
    "notes"=>"",
    "event_rules_attributes"=>[
      {
        "extra_information"=>"{}",
        "lookup_key_value_pair_id"=>40
      }
    ]
  }
}


# controllers/events_controller.rb
def create
  event = Event.new(event_params)

  if event.save
    # SUCCESS
  else
    # FAILURE
  end
end

private

def event_params
  params.require(:event).permit(:name, :code, :is_active, :description, :notes, :goal_amount, :export_id, :default_currency, :event_start_date, :event_end_date, :notes, event_rules_attributes: [:extra_information, :lookup_key_value_pair_id])
end

# models/event.rb
accepts_nested_attributes_for :event_rules
相关问题