Jason Blade
Jason Blade

Reputation: 383

How to retrieve all attributes from params without using a nested hash?

I am currently in the process of making my first iphone app with a friend of mine. He is coding the front end while I am doing the back end in Rails. The thing is now that he is trying to send necessary attributes to me with a post request but without the use of a nested hash, which means that that all attributes will be directly put in params and not in a "subhash". So more specifically what I want to do is be able to retrieve all these attributes with perhaps some params method. I know that params by default contains other info which for me is not relevant such as params[:controller] etc.. I have named all attributes the same as the model attributes so I think it should be possible to pass them along easily, at least this was possible in php so I kind of hope that Rails has an easy way to do it as well.

So for example instead of using User.new(params[:user]) in the controller I have the user attributes not in the nested hash params[:user] but in params directly, so how can I get all of them at once? and put them inside User.new()?

Upvotes: 0

Views: 1238

Answers (3)

Jason Blade
Jason Blade

Reputation: 383

I found the solution to my problem. I had missed to add the attr_accessible to my model which was what initially returned the error when I tried to run code like: User.new(params) having been passed multiple attributes with the post request.

The solution was very simple, maybe too simple, but since this is my first real application in Rails I feel that it might be helpful for other newbies with similar problems.

Upvotes: 1

KARASZI István
KARASZI István

Reputation: 31467

You can fetch the available attributes from a newly created object with attribute_names method. So in this special example:

u = User.create
u.attributes = params.reject { |key,value| !u.attribute_names.include?(key)
u.save

Upvotes: 0

SnapShot
SnapShot

Reputation: 5544

If you would like to just pass a more limited version of params to new, you should be able to do something like the following:

params = { item1: 'value1', item2: 'value2', item3: 'value3' }
params.delete(:item2)
params # will now be {:item1=>"value1", :item3=>"value3"} 

Also see this for an explanation of using except that you mention in your comment. An example of except is something like:

params.except(:ssn, :controller, :action, :middle_name)

Upvotes: 0

Related Questions