Ruby on Rails, two models in one form

后端 未结 5 1153
我在风中等你
我在风中等你 2021-01-31 05:57

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

class Pretreatment < ActiveRecord::Base
  belongs_to :patient
  a         


        
相关标签:
5条回答
  • 2021-01-31 06:08

    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:

     <div class="field">
       <%= f.label :content %><br />
       <%= f.text_field :content %>
     </div>
     <%= fields_for(@patient, @patient.diagnoses.build) do |u| %>
     <div class="field">
       <%= u.label :content %><br />
       <%= u.text_field :content %>
     </div>
     <% end %>
     <div class="actions">
       <%= f.submit %>
     </div>
    
    0 讨论(0)
  • 2021-01-31 06:19

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

    0 讨论(0)
  • 2021-01-31 06:20

    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!!!

    0 讨论(0)
  • 2021-01-31 06:23

    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.
    0 讨论(0)
  • 2021-01-31 06:28

    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|%>
        <h3>Pretreatments:</h3>
    
        <%= f.fields_for :pretreatments do |field| %>
            <%= field.label "Content" %></div>
            <%= field.text_field :content %>
        <% end %>
    
        <h3>Diagnosis:</h3>
    
        <%= f.fields_for :diagnosiss do |field| %>
            <%= field.label "Content" %></div>
            <%= field.text_field :content %>
        <% end %>
    
        <%=f.submit  %>
    <% end %>
    

    And that all

    0 讨论(0)
提交回复
热议问题