Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Saturday, April 16, 2016

Ruby on Rails, two models in one form

Ruby on Rails, two models in one form


I have two very similar models Pretreatment and Diagnosis, that belong to the model Patient:

class Pretreatment < ActiveRecord::Base    belongs_to :patient    attr_accessible :content  end    class Diagnosis < ActiveRecord::Base    belongs_to :patient    attr_accessible :content  end    class Patient < ActiveRecord::Base    attr_accessible :age, :name, :city, :street, :number    has_many :anamneses    has_many :befunds  end  

On the Patient show page I'm displaying two forms, one for the Preatreatment and another for the Diagnosis:

<%= form_for([@patient, @patient.preatreatments.build]) do |f| %>    
<%= f.label :conten %>
<%= f.text_field :content %>
<%= f.submit %>
<% end %> <%= form_for([@patient, @patient.diagnosiss.build]) do |f| %>
<%= f.label :content %>
<%= f.text_field :content %>
<%= f.submit %>
<% end %>

My question is how can I bring the two forms together, so that the user only has to press once the submit button? Im not sure but I think nested attributes is not the right thing to handle it, maybe thefields_for` tag?

Update I tried to use fields_for tag:

   <%= form_for([@patient, @patient.pretreatment.build]) do |f| %>       
<%= f.label :content %>
<%= f.text_field :content %>
<%= fields_for([@patient, @patient.diagnosiss.build]) do |u| %>
<%= u.label :content %>
<%= u.text_field :content %>
<% end %>
<%= f.submit %>
<% end %>

But I get the error:

undefined method `model_name' for Array:Class in <%= fields_for([@patient,@patient.befunds.build]) do |u| %>  

Answer by Sven Koschnicke for Ruby on Rails, two models in one form


You can use fields_for for the second model, which works like form_for but doesn't generate the form tags. See the docs.

Answer by Anand Soni for Ruby on Rails, two models in one form


There are some gems available for nested forms. one of them is awesome_nested_fields. I haven't used this earlier but that shows good code in documentation. Another one is simple_form.

Hope that helps!!!

Answer by Martin M for Ruby on Rails, two models in one form


Use fields_for for the associated models.
There should be no square brackets arround the parameters of fields_for

In your code example, I cannot find the relation between Patient and Diagnosis, and the plural of diagnosis is diagnoses, you can specify this in config/initializers/inflections.rb:

ActiveSupport::Inflector.inflections do |inflect|    inflect.irregular 'diagnosis','diagnoses'  end  

So your Patient model should contain

class Patient < ActiveRecord::Base    attr_accessible :age, :name, :city, :street, :number    has_many :diagnoses  end  

And you can write in your form:

 
<%= f.label :content %>
<%= f.text_field :content %>
<%= fields_for(@patient, @patient.diagnoses.build) do |u| %>
<%= u.label :content %>
<%= u.text_field :content %>
<% end %>
<%= f.submit %>

Answer by Muntasim for Ruby on Rails, two models in one form


You can achieve that using nested attributes :

patient.rb

class Patient < ActiveRecord::Base    attr_accessible :age, :name,  :pretreatments_attributes, :diagnosiss_attributes    has_many :pretreatments    has_many :diagnosiss      accepts_nested_attributes_for :pretreatments    accepts_nested_attributes_for :diagnosiss  end  

patients_controller.rb

def show      @patient = Patient.find(params[:id])      @patient.pretreatments.build      @patient.diagnosiss.build      respond_to do |format|        format.html # show.html.erb        format.json { render json: @patient }      end    end  

patients/show.html.erb:

<%= form_for @patient do  |f|%>      

Pretreatments:

<%= f.fields_for :pretreatments do |field| %> <%= field.label "Content" %>
<%= field.text_field :content %> <% end %>

Diagnosis:

<%= f.fields_for :diagnosiss do |field| %> <%= field.label "Content" %>
<%= field.text_field :content %> <% end %> <%=f.submit %> <% end %>

And that all

Answer by roryhughes for Ruby on Rails, two models in one form


There are a few ways of doing this:

  1. The way the fields_for works is you have a form_for for the parent model and within it you can place fields_for the models which belong to the parent. A good example is given in the Rails Docs
  2. A simple and more extensible option over time but not very "semantic" one would be to use JavaScript/JQuery. You could trigger $("form #new_pretreatments").submit(); and the same for the Diagnosis once a button is clicked.
  3. Maybe instead you could have just one model to store them both. For example a model called Disease. Each time a patient gets a disease a new one is created and it has columns for each the Diagnosis and Pretreatment. It's probably the best option instead of adding another model for each bit of info a patient can have.


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.