Access a “session” variable in a nested model

Hello people.

I have a big problem here. In my rails 3.0.9 app I have a model
"invoice" that model "accepts nested attributes" for "invoice
details". So, I don't have a "controller" nor "views" for "invoice
details", just model, because I have a "partial" in "invoices views"
for the "nested attributes".

The thing is that I need to run a custom validation when every
"invoice details" is created, and I need a variable stored in
"session". But Models can not access "session" variables.

So I want to know, how can I access that variable and then use it in
my validation.

Thanks

Is the custom validation to do with data in the invoice? I believe
you can access the invoice that the details belong to in the
validation.

Also possibly reject_if on accepts_nested_attributes_for might do the job.

If all else fails you could add a non-database attribute to invoice
details and set that prior to saving, then pick it up in the
validation.

Colin

the validation is for quantity of products, the idea is, if the user
try to enter a quantity greater than the available quantity of
products, then the validation error must show up.

The problem is, products are in differents storages, and storages
belongs to a branch (a company or enterprise has a main office and has
many branches). so, I have to start my validation finding the storages
that belongs to a certain branch, when I have the storages I have to
find the product and get the total quantity of that product.

The thing is that, to get the branch id, I need to access to
"session[:user].branch_id", but I can't do that in the model.

Can you give me, please, an example of the last option

"If all else fails you could add a non-database attribute to invoice
details and set that prior to saving, then pick it up in the
validation."

I don't know how to add a non-database attribute in a _partial for
nested attributes, neither how to set it prior to saving

Could you help me, please

the validation is for quantity of products, the idea is, if the user
try to enter a quantity greater than the available quantity of
products, then the validation error must show up.

The problem is, products are in differents storages, and storages
belongs to a branch (a company or enterprise has a main office and has
many branches). so, I have to start my validation finding the storages
that belongs to a certain branch, when I have the storages I have to
find the product and get the total quantity of that product.

The thing is that, to get the branch id, I need to access to
"session[:user].branch_id", but I can't do that in the model.

Can't you get at the branch via the invoice?

Can you give me, please, an example of the last option

"If all else fails you could add a non-database attribute to invoice
details and set that prior to saving, then pick it up in the
validation."

I don't know how to add a non-database attribute in a _partial for
nested attributes, neither how to set it prior to saving

Actually you probably can't do this directly when you are using
accepts nested attributes as you don't have a point in the controller
at which you can set the variable before saving. However, if the
branch is not available already via the invoice then provide a class
member variable of Invoice (look up member variables and attr_accessor
if you don't know how to do this, note, not attr_accessible), and set
the branch id there before the save or update_attributes in the
controller. However, as I suggested above, I would have thought the
invoice would already contain information about the branch.

By the way, it is better to interleave your reply with the previous
post rather than putting it at the top, then you will not have to
repeat sections from my post as you did above, and it will be easier
to follow the thread.

Colin