2012-01-14 1 views
0

У меня есть приложение для рельсов 3, где есть несколько регистраций (диагноз, пациент, лабораторный тест, клиент, пользователь, поставщик). Первоначально они будут заполнены путем посева базы данных. Требование для описания кодов, которые будут смешаны случай (капитализируются первое слово), когда либо 1. указано в приложении (некоторые настройки конфигурации - еще предстоит определить) 2. указанного пользователем ввода данныхRails 3 - как реализовать изменяющийся случай описаний на основе check_box_tag (не является частью модели) в обратном вызове before_save во внешнем классе

В настоящее время I есть модель, вид & контроллера для диагностики, который содержит два поля: 1. кода (всегда быть капитализированы) 2. описание (Первое слово капитализируется на основе значения check_box_tag)

в настоящее время я использую before_save обратный вызов в для реализации преобразования, но я не могу заставить его работать, только когда check_box_tag не выбран, т.е. игнорирует check_box_ta г.

Я попытался изменить check_box_tag на check_box, добавив attr_assessor к модели (но не sqlite3 db, поскольку он не требуется хранить).

Это тоже не сработало.

Как это сделать? Как переопределить опцию использования флажка из внутреннего файла конфигурации приложения, в результате которого флажок «недоступен» или не отображается, если конфигурация приложения не выбирается пользователем?

Модель (diagnosis.rb)

require 'DescriptionHelper' 

class Diagnosis < ActiveRecord::Base 
    attr_accessible :code, description 

    string_correct_case = DescriptionHelper.new([:code, :description]) 

    validates :code, :presence => true, :length => { :minimum => 4, :maximum => 4 } 
    validates :description, :presence => true 

    before_save string_correct_case 

end 

Обратный звонок в DescriptionHelper.rb

class DescriptionHelper 
    def initialize(attribute) 
    @attrs_to_manage = attribute 
    end 

    def before_save(record) 
    @attrs_to_manage.each do |attribute| 
     record.send("#{attribute}=", capitaliseWords(record.send("#{attribute}"))) 
    end 
    end 

    private 
    def capitaliseWords(value) 
     value = value.mb_chars.downcase.to_s.gsub(/\b\w/) { |first| first.upcase } 
    end 
    end 

Controller (diagnoses_controller.rb)

class DiagnosesController < ApplicationController 

    def new 
    @diagnosis = Diagnosis.new 
    end 

    def create 
    @diagnosis = Diagnosis.new(params[:diagnosis]) 

    if @diagnosis.save 
     flash[:notice] = "Diagnosis created with params [#{@diagnosis.attributes.inspect}" #for debugging, once fixed will be just 'Diagnosis created.' 
     redirect_to @diagnosis 
    else 
     flash[:alert] = "Diagnosis not created." 
     render :action => "new" 
    end 
    end 

    .. other controller actions - edit, show, destroy 

end 

View (_form.html.erb)

<%= form_for(@daignosis) do |f| %> 
    <div class="field"> 
    <%= f.label :code %> 
    <%= f.text_field :code %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %> 
    <%= f.text_field :description %> 
    </div> 
    <div class="field"> 
    <%= check_box_tag("diagnosis_desc_dont_convert", 1, false) %><%= f.label "Leave as entered" %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Когда это выполняется в настоящее время, check_box_tag игнорируется.

При добавлении в модель attar_assessor: description_correctcase и изменении вида использования f.check_box 'description_correctcase' это по-прежнему игнорируется.

Как можно заставить это работать?

Заранее благодарим за проектирование рельсов.

ответ

0

Наконец-то появилось решение проблемы после прочтения и повторного чтения различных SO-решений для составных частей моего вопроса. Я не уверен, что он правильный с точки зрения рельсов, но он работает.

Если вы можете предложить мне лучшее решение, я бы, конечно, научился этому.

Это мое решение.

Модель (диагностика.Р.Б.)

require 'DescriptionHelper' 

class Diagnosis < ActiveRecord::Base 
    attr_accessor :do_not_correctcase 
    attr_accessible :code, :description, :do_not_correctcase 

    before_save DescriptionHelper.new([:code, :description]), :if => 
         lambda { |d| d.do_not_correctcase.to_s == '0' } 

    validates :code, :presence => true, :length => { :minimum => 4, :maximum => 4 } 
    validates :description, :presence => true 

end 

Это я отсчитываются от следующего SO раствора - https://stackoverflow.com/a/6388691/1108010

Controller (diagnoses_controller.rb)

class DiagnosesController < ApplicationController 

    def new 
    @diagnosis = Diagnosis.new 
    end 

    def create 
    @diagnosis = Diagnosis.new(params[:diagnosis]) 
    @diagnosis.do_not_correctcase = params[:diagnosis][:do_not_correctcase] 

    logger.debug "New diagnoses: #{@diagnosis.attributes.inspect}" 
    logger.debug "Diagnosis should be valid: #{@diagnosis.valid?}" 
    logger.debug "code has value #{params[:code]}" 


    if @diagnosis.save 
     flash[:notice] = "Diagnosis created with params [#{@diagnosis.attributes.inspect}" #for debugging 
     redirect_to @diagnosis 
    else 
     flash[:alert] = "Diagnosis not created." 
     render :action => "new" 
    end 
    end 

    .. other controller actions - edit, show, destroy 

end 

Я также изменил вид заменить check_box_tag с check_box.

View (_form.html.erb)

<%= form_for(@daignosis) do |f| %> 
    <div class="field"> 
    <%= f.label :code %> 
    <%= f.text_field :code %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %> 
    <%= f.text_field :description %> 
    </div> 
    <div class="field"> 
    <%= f.check_box 'do_not_correctcase' %><%= f.label "Leave as entered" %><br /> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Так, несмотря на получение этой работы я не ясно, являются следующие:

  1. При проверке атрибутов с "#{@diagnosis.attributes.inspect}". Я предполагаю, что причина, по которой переменная attr_accessor не включена в выход нового диагноза, заключается в том, что она не является частью таблицы базы данных, и поэтому Active Reocrd не создает ее как часть новой записи с @ diagn.new Может ли кто-нибудь быть достаточно, чтобы это подтвердить.

  2. Почему журнал не имеет значения для logger.debug "code has value #{params[:code]}"? Что заставляет params[:code] быть нулевым в выводе журнала?

Logfile содержал следующую запись:

Started POST "/diagnoses" for 127.0.0.1 at 2012-03-05 09:36:38 +0000 
    Processing by DiagnosesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"RW/mzkhavGeaIW0hVLn0ortTnbCDlrX+FfzH4neLLsA=", "diagnosis"=>{"code"=>"tt02", "description"=>"description for tt02", "do_not_correctcase"=>"1"}, "commit"=>"Create Diagnosis"} 
New diagnosis: {"code"=>"tt02", "created_at"=>nil, "description"=>"description for tt02", "updated_at"=>nil} 
Diagnosis should be valid: true 
code has value 

Я бы очень хотел бы знать, что это правильный способ сделать все это, как я считаю, что это не очень сухим или чистым.