2014-11-04 3 views
0

У меня есть модель пользователя, которая имеет атрибуты строки stage_name и real_name. То, что я хотел бы сделать, находится в моем _form.hmlt.erb, у меня есть флажок рядом с полем ввода истинного имени, которое спрашивает: Настоящее имя - сценическое имя?. Если этот флажок установлен, я бы хотел присвоить реальное имя в качестве имени сцены и теперь изменить его имя реального времени input box with real_name`. До сих пор у меня есть:Назначение атрибутов экземпляра модели на основе значения флажка

_form.html.erb

<%= form_for @user do |f| %> 
    <div> 
    <%= f.text_field :stage_name %> 
    <%= f.text_field :stage_name %> 
    </div> 

    <div> 
    <%= f.text_field :real_name %> 
    <%= f.text_field :real_name %> 

    # Not sure how to bind my model code to this checkbox 
    <%= f.checkbox %> 
    <%= f.label 'Real name is stage name?' %> 
    </div> 

    <div> 
    <%= f.submit %> 
    </div> 
<% end %> 

<script> 
    $(function() { 
    $("input[type='checkbox']").click(function() { 
     var $checkbox = $(this), 
      $secondForm = $("input[type='text']").eq(2); 

     if ($checkbox.is(":checked")) { 
     $secondForm.attr("disabled", true).val("<%= @user.real_name %>"); 
     } else { 
      $secondForm.attr("disabled", false).val(""); 
     } 
    }); 
)}; 
</script> 

ответ

0

Удалось создать элегантное решение на основе скриптов, не требуя никакой логической схемы. Очень важно отметить, что использование атрибута disabled для моего окна ввода предотвращало сохранение данных. Вместо этого я использовал readonly и установил его на false, когда он снят. Важнейшим выводом было определение того, как держать флажок установленным/непроверенным, несмотря на то, что он не отличается от модели. Используя первое условие, все это становится возможным.

Подводя итог, когда документ загружает скрипт, сначала проверяет, соответствует ли значение имени этапа значению реального имени. Если это флажок установлен. Как только внутри представления редактирования функция щелчка используется для переключения состояния ввода имени реального имени.

_form.html.erb

_scripts.html.Еврорадио

<script> 
    $(function() { 
     var $nameCheck = $('#user_name_check'), 
      $stageName = $('#user_stage_name'), 
      $realName = $('#user_real_name'), 
      $originalVal = $stageName.val(); 

     // Checks and mirrors user's real name and stage name 

     if ($realName.val() == $stageName.val() && $realName.val() != '') 
      $stageName.attr({ 
       checked: 'checked', 
       readonly: 'readonly' 
      }); 
     } 

     $nameCheck.click(function() { 
      if ($nameCheck.is(':checked')) { 
       $stageName.attr('readonly', 'readonly').val($realName.val()); 
      } else { 
       $stageName.attr('readonly', false).val($originalVal).focus(); 
      } 
     }); 
    }); 
</script> 
1

Все, что вам нужно сделать, это назначить атрибут аксессор в вашей модели.

attr_accessor :real_name_is_stage_name 

Это создаст непостоянный атрибут в вашей модели, которые вы можете проверить в одном из обратных вызовов, если значение 1 затем установите real_name = stage_name, например:

before_save do 
    if real_name_is_stage_name == "1" 
    real_name = stage_name 
    end 
end 

Затем установите флажок, чтобы взаимодействовать с изменениями, которые вы сделали, так что вы можете отправить значение чекбокса модели следующим образом:

<%= f.check_box :real_name_is_stage_name %> 

Если вы сделаете это, в яваскрипта коде вам нужно будет только отключить название Stage text_field когда check_box проверяется и рельсы будут делать остальную работу

Model.rb

class Model < ActiveRecord::Base 
    attr_accessor :name_check 
    ## Validation 
    ## Callbacks 
    before_validation do 
    if self.name_check == "1" and self.stage_name.present? and !self.real_name.present? 
     self.real_name = self.stage_name 
    end 
    end 
end 

_form.html.erb

<%= form_for @user do |f| %> 
    <%= render 'shared/error_messages', object: @user %> 

    <div> 
     <%= f.label :stage_name %><br> 
     <%= f.text_field :stage_name %> 
    </div> 

    <div> 
     <%= f.label :real_name %><br> 
     <%= f.text_field :real_name %> 
     <div> 
      <%= f.label :name_check, 'Real Name is Stage Name?' %> 
      <%= f.check_box :name_check, value: f.obj.real_name.eql?(f.obj.stage_name)? "1" : "0" if f.obj.real_name.present? and f.obj.stage_name.present? %> %> 
     </div> 
    </div> 

    <div> 
     <%= f.label :origin %><br> 
     <%= f.text_field :origin %> 
    </div> 

    <%= f.submit %> 
<% end %> 

<%= render 'scripts' %> 

_scripts.html.erb

<script> 
    $(function() { 
     var $nameCheck = $('#artist_name_check'), 
      $stageName = $('#artist_stage_name'), 
      $realName = $('#artist_real_name'), 
      $originalVal = $stageName.val(); 

     // Checks and mirrors artist's real name and stage name 

     if ($nameCheck.is(':checked')) { 
      $stageName.attr("readonly", "readonly"); 
     } 

     $nameCheck.click(function() { 
      if ($nameCheck.is(":checked")) { 
       $stageName.attr("readonly", "readonly").val($realName.val()); 
      } else { 
       $stageName.attr("readonly", false).val($originalVal).focus(); 
      } 
     }); 
    }); 
</script> 
+0

если вы проверки присутствия 'stage_name' затем добавить свой код в' before_validation' блока вместо 'before_save' –

+0

: значение real_name_is_stage_name является не экономия. Добавлен код выше плюс допустимый ': real_name_is_stage_name' в методе user_params моего контроллера, но не повезло. –

+0

Значение не должно быть сохранено, это только временное значение, которое скажет вам, установлен ли флажок или нет. Вы подтверждаете наличие «stage_name». Можете ли вы показать мне обновленный код модели? –

Смежные вопросы