Is there a way in strong parameters to permit all attributes of a nested_attributes model? Here is a sample code.
class Lever < ActiveRecord::Base has_one :lever_benefit accepts_nested_attributes_for :lever_benefit end class LeverBenefit < ActiveRecord::Base # == Schema Information # id :integer not null, primary key # lever_id :integer # explanation :text end
For lever strong parameters i am writing currently this
def lever params.require(:lever).permit(:name,:lever_benefit_attributes => [:lever_id, :explanation]) end
Is there a way for nested attributes i can write to permit all attributes without explicitly giving the attributes name like lever_id
and explanation
?
Note: Please don't get confused with this question with permit!
or permit(:all)
this is for permitting all for nested attributes
Nested attributes provide a mechanism for updating documents and their associations in a single operation by nesting attributes in a single parameters hash. This is useful when wanting to edit multiple documents within a single web form.
Strong Parameters, aka Strong Params, are used in many Rails applications to increase the security of data sent through forms. Strong Params allow developers to specify in the controller which parameters are accepted and used.
The only situation I have encountered where permitting arbitrary keys in a nested params hash seems reasonable to me is when writing to a serialized column. I've managed to handle it like this:
class Post serialize :options, JSON end class PostsController < ApplicationController ... def post_params all_options = params.require(:post)[:options].try(:permit!) params.require(:post).permit(:title).merge(:options => all_options) end end
try
makes sure we do not require the presents of an :options
key.
Actually there is a way to just white-list all nested parameters.
params.require(:lever).permit(:name).tap do |whitelisted| whitelisted[:lever_benefit_attributes ] = params[:lever][:lever_benefit_attributes ] end
This method has advantage over other solutions. It allows to permit deep-nested parameters.
While other solutions like:
nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)
Don't.
Source:
https://github.com/rails/rails/issues/9454#issuecomment-14167664
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With