I have rails application which represent multistep investigation form.
Urls look like research/step1, research/step2, research/step3 etc.
At one of this step (3/10) - I have form of user settings (email, phone, name etc).
How to organize controllers with actions to processing user data
If I understand your question well, you want to build a multistep form (also known as a "wizard").
Here is an episode from RailsCasts that goes over this topic that you might find helpul: http://railscasts.com/episodes/217-multistep-forms.
Related
I have a knockout application I am building that has multiple viewModels in one page.
I have been mocking data so far but I am now building the API that will run it.
My question is what do I do with complex viewModels with regards to the API.
For example I have a 'add company' page that has the following tabs:-
Company info (name, address, etc.)
People at company (multiple people)
Insurance Documentation (3 different types)
I currently have each of these as separate viewModels.
When I press save I am now confused what is the best way to do things.
If I send all 3 viewModels bundled together (add them to one master viewModel) then it becomes easy to ensure that IDs all line up but that doesn't seem very modular or a good idea and breaks the idea of being 'API Centric'.
However if I send each viewModel to a different API end-point how do I ensure that the ID's match-up correctly (people -> company) etc.
At the moment I am looking at two options:-
When press 'add new' create a blank company on the database and grab its ID -> use this to match everything up.
OR -
When I press save send the new company up first, then when response comes back as (hopefully) ok then upload the rest of the information to their respective end-points using the now correct ID.
Both seem messy so I am wondering what is the 'accepted' best way to do this??
Your second approach is how I would do it, pressing Save would send the Company model first. Then once you receive the 'OK' response with the Company id, in the callback you can add it to the other models and send them up.
Nothing messy about that, just standard asynchronous behaviour.
Theoretical question. Lets say I build an application for managing clients, products, bills and such. All without a user login.
Is it possible to get multi user (each one with his own clients,products,...) functionality after the main application is done?
Or should I think of the multi user in the first place? How flexible is rails at this part?
thanks in advance
dennym
What you are asking for is a pattern called Multitenant. There are different ways to do it, but none are provided by Rails natively.
You could start with this slide: http://www.slideshare.net/tardate/multitenancy-with-rails
And figure out if you want to do; partitioning based on data, Rbac, model or schema.
There are is one that offers it as a service that says that it is easy to do after you have your application: http://railskits.com/saas/
But in our experience, it was a bit outdated and missing some features that we wanted.
You can also take a look at other gems like: multitenant or act_as_tenant.
We ended up using act_as_tenant and doing it from the beginning.
For example,
I want to separate the online shop into three parts.
User: the user related information, for example, they login. logout.
Communication: sending email, or newsletter modules.
ShoppingCart: displaying order.
Ok, these three module is the main function of of my little online store.
Clearly, the user medule, deal with its own stuff, for example, user change their profile pic(ok, I think it is non-sense to have a profile pic for user, just think it is an example.)
user ---call---> user
But I got a problem here, is when the user doing some functions, which require cross-module call....
Let me give a example, if the user lost the password, the user needs to use the communication method to send a new password to him/her...The situation will become somethings like that:
user ----call---> communication
A worse situation is use all the modules, here is the situation:
The user using a shopping chart to deal with his/her shopping, after that, he /she make the order, and a invoice use communication modules to send to the user.
user ----call---> shoppingCart ---call---> Communication
Therefore, each module is not separate, all modules knows each others.... But I don't want to do that, for example, this time I am doing a new application, for example, I doing a video sharing web site which only use "user" and "communication", I don't really need the "shoppingChart. ", and having a new video module.....
It is ok for me "upgrade" my user and communication method to deal with the video module, but the question is, if I got something bugs fix, for example, the getFullName method is doing something wrong, when I need to "upgrade" back the online shop application, I need to take the "video" module too.....
What I wanna to ask is, how to separate their responsibility, and how to make the code more reusable? Thank you.
It is good practice to minimize the coupling in your application, but removing it entirely is not always possible.
My recommendation would be to build base classes User, Communication, and ShoppingCart that provide only basic interfaces, such as getFullName()
Then, for each application, write separate wrappers that are able to interact with your base classes. You may have an OnlineShopping class and a VideoSharing class, that contain the functions you need that are specific for each application.
There are a number of structural patterns that may help you out with your design. Also, take advantage of inheritance for functionality that is similar across all applications.
I'm using devise for authentication and I'm looking for an authorization framework that lets me declare edit permissions for specific model attributes.
I have three different roles in my app: Teacher, Parent, and Student. The Student model belongs_to Family. When a Teacher creates a Student, they are able to set the Family association. When a Parent visits the edit page for a Student, however, they should not be able to change that association, only view it.
In the view, it's easy to alter the form depending on who is viewing it (disable or don't disable the family select input, for example) but a crafted form can get around that. What I need is something that will throw some kind of authorization exception when someone tries to change an attribute that they are not allowed to change.
I'm currently looking at declarative_authorization, but it seems it's not fine-grained enough to restrict changes to attributes, only the model as a whole.
I've ended up using the new MassAssignmentSecurity feature, although it looks like it might not work that great in conjunction with accepts_nested_attributes_for.
I realize my answer comes 2 years late. For what it's worth what you need is an authorization framework that is fine-grained enough.
XACML, the standard from OASIS provides just that. It can handle any number of attributes.
See my detailed answer here: Rails 4 authorization gem
I'm building a workflow for a Rails app in which a user logs into the system, and on the home page to the app a supervisor selects a student and a tutor who the student spent time. Then they submit the form. This should all happen on the app's home page. My problem is since it is not known when you go to that page who the specific student is, and thus who this form is for, it's not obvious to me how to setup the view and controller for this page.
Perhaps the form is for the lesson, but I've got a document (MongoDB) data model in which the lesson is embedded within the student document.
I could imagine a workflow where the user sees a list of students on the home page, and then clicks on the student to go to the model/controller for that specific student, and then enters the lesson's info there, but I'm trying to avoid unnecessary clicks and screens if possible.
Is my data model wrong? Is there a way to build this and keep my current data model? Is there a Rails pattern or helper that I should be aware of?
Thanks,
Bob.
When you build a workflow, you usually have one of your controllers behave as an orchestrator, and that controller sends the user to the right page.
Since you only want one form to send a user to 2 potential pages, you could post the form to a controller (a controller called "search" for example), and that controller decides weather to redirect the user to one of the two views, with the necessary parameters in the url (such as student_id, tutor_id or lesson_id).
And please work on your accept rate, you won't get many responses otherwise.