The reason I down voted Mike K's answer is because the declaration of the params does not appear to be the issue:

I believe the issue will be in how you're assigning params
in the button_to
:
button_to 'Submit', approve_collection_message_posts_path, params: { message_post: { post_ids: ['1', '2'] } }, data: { config: 'Are you sure?', remote: true }

Notice: <input type="hidden" name="message_post" value="post_ids%5B%5D=1&post_ids%5B%5D=2" />
This is why you're getting your error (there is no nesting in your array) -- your params literally look like: "message_post" => "post_ids%5B%5D=1&post_ids%5B%5D=2"
Fix
There is a cheap way to fix it:
def message_post_collection_params
params.permit(post_ids:[])
end
= button_to 'Submit', path_helper, params: { post_ids: ["1","2"] }, data: { config: 'Are you sure?', remote: true }

--
If you wanted to retain your nesting, you could use the following comment:
Note that the params option currently don't allow nested hashes.
Example: params: {user: {active: false}}
is not allowed. You can
bypass this using the uglyparams: {:"user[active]" => true}
params: {:"message_post[post_ids]" => ["1","2"]}
