Ruby on Rails, две модели в одной форме

Не все ли здесь ответы с блоками try / catch содержат .close (), содержащиеся в блоке finally?

Пример для отмеченного ответа:

PrintWriter out = null;
try {
    out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)));
    out.println("the text");
}catch (IOException e) {
    System.err.println(e);
}finally{
    if(out != null){
        out.close();
    }
} 

Кроме того, с Java 7 вы можете использовать оператор try-with-resources . Для закрытия объявленного ресурса (ов) не требуется блок finally, потому что он обрабатывается автоматически, а также менее подробен:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
    out.println("the text");
}catch (IOException e) {
    System.err.println(e);
}

17
задан toro2k 16 June 2013 в 08:44
поделиться

5 ответов

Используйте fields_for для связанных моделей.
Не должно быть квадратных скобок вокруг параметров fields_for

В вашем примере кода я не могу найти связь между Patient и Diagnosis, и множественное число диагноза ставит диагноз , вы можете указать это в config/initializers/inflections.rb:

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

Таким образом, ваша модель Patient должна содержать

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

И вы можете написать в своей форме :

 <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>
20
ответ дан Martin M 16 June 2013 в 08:44
поделиться

Вы можете добиться этого, используя вложенные атрибуты:

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

Patient_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

пациентов / 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 %>

И это все

6
ответ дан Muntasim 16 June 2013 в 08:44
поделиться

Есть несколько способов сделать это:

  1. То, как работает fields_for, заключается в том, что у вас есть form_for для родительской модели, и внутри нее вы можете поместить fields_for модели которые принадлежат родителю. Хороший пример приведен в Rails Docs
  2. . Простой и более расширяемый вариант с течением времени, но не очень "семантический", - использовать JavaScript / JQuery. Вы можете вызвать $("form #new_pretreatments").submit(); и то же самое для Диагностики после нажатия кнопки.
  3. Возможно, вместо этого у тебя могла бы быть только одна модель, чтобы сохранить их обоих. Например модель под названием Болезнь. Каждый раз, когда пациент получает заболевание, создается новое, в котором есть столбцы для каждого диагноза и предварительной обработки. Вероятно, это лучший вариант, вместо добавления другой модели для каждой информации, которую может иметь пациент.
2
ответ дан roryhughes 16 June 2013 в 08:44
поделиться

Вы можете использовать fields_for для второй модели, которая работает как form_for, но не генерирует теги формы. См. документы .

1
ответ дан Sven Koschnicke 16 June 2013 в 08:44
поделиться

Для вложенных форм доступно несколько драгоценных камней. один из них - awesome_nested_fields . Я не использовал это ранее, но это показывает хороший код в документации. Другой является simple_form .

Надеюсь, это поможет !!!

1
ответ дан Anand Soni 16 June 2013 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: