Rails开发某个单一功能流程记录2019-5-26

Rails开发某个单一功能流程

  1. 更新项目到最新状态:git pull
  2. 切换开发分支
  3. 按照MVC划分各操作步骤。

创建和切换到我的开发分支

git branch dev-hw
git checkout dev-hw

Model

切换到项目更目录下,创建Model

rails g model ParamValueOption  bad_values:text part_names:text color_values:text size_values:text

修改我们的迁移文件

#db/migrate/20190526022622_create_param_value_options.rb 
class CreateParamValueOptions < ActiveRecord::Migration[5.1]
  def change
    create_table :param_value_options do |t|
      t.text :bad_values,  comment: '不良品原因选项'
      t.text :part_names, comment: '工部名称选项'
      t.text :color_values, comment: '颜色值选项'
      t.text :size_values, comment: '衣服尺寸选项'

      t.timestamps
    end
  end
end

执行数据迁移

#主要会执行这两条命令,一个是执行全部,一个单次回滚,便于修改数据库迁移内容
rails db:migrate  
rails db:rollback   #如果需要修改迁移文件内容,先执行这条命令。

到此我们就完成了model的表的创建,还需要对表对应的类:ParamValueOption进行修改

对应的Model类的修改

  1. 根据业务需要,表里面目前只用保存一条记录,为了方便查询,增加一个类方法:current
class ParamValueOption < ApplicationRecord
  attr_accessor(
    :color_values_text_area,
    :size_values_text_area,
    :part_names_text_area,
    :bad_values_text_area
  )
  serialize :color_values, Array
  serialize :size_values, Array
  serialize :part_names, Array
  serialize :bad_values, Array


  def self.current
    self.first || self.create(color_values: ['黑色', '白色', '红色', '蓝色', '绿色'],
                size_values: ['S', 'M', 'L', 'XL', 'XXL'],
                part_names: ['门襟', '领子', '袖子', '里布' , '花边'],
                bad_values: ['不直', '起皱', '大小', '不对称', '不顺'])
  end

  def color_values_text_area
    (color_values || []).join("\n")
  end

  def size_values_text_area
    (size_values || []).join("\n")
  end

  def part_names_text_area
    (part_names || []).join("\n")
  end

  def bad_values_text_area
    (bad_values || []).join("\n")
  end

现在model基本能用了,需要在后台给用户提供查看和编辑的页面。因为之前已经有了个SettingsController, 这个功能只有查看和修改功能,考虑在Settings下增加对应的逻辑控制,在index页面通过ajax提交。

Controller和View

  1. 在SettingController下新增一个接收提交的ParamValueOption数据的方法:updateoptions
  def updateoptions
    if @param_value_option.update(param_value_options)
      render js: "alert('#{t('常用.修改成功')}');"
    else
      render js: "alert('#{t('常用.发生错误')}');"
    end

  end

  private

  def param_value_options
    params.require(:param_value_option).permit(
    ).merge(
      color_values: (params[:param_value_option][:color_values_text_area] || '').split("\n").uniq.delete_if {|x| x == ''},
      size_values: (params[:param_value_option][:size_values_text_area] || '').split("\n").uniq.delete_if {|x| x == ''},
      part_names: (params[:param_value_option][:part_names_text_area] || '').split("\n").uniq.delete_if {|x| x == ''},
      bad_values: (params[:param_value_option][:bad_values_text_area] || '').split("\n").uniq.delete_if {|x| x == ''}
    )
  end
  1. 修改view页面index,增加form表单
#_form.html.slim
.ui.segment.form
  = form_for @param_value_option, url: updateoptions_v1_admin_panel_settings_path, remote: true do |f|
    .four.fields
      .required.field
        label = StyleItem.human_attribute_name :color_values
        = f.text_area :color_values_text_area, placeholder: "1...\n2...\n3..."
      .required.field
        label = StyleItem.human_attribute_name :size_values
        = f.text_area :size_values_text_area, placeholder: "1...\n2...\n3..."
      .required.field
        label = StyleItem.human_attribute_name :part_names
        = f.text_area :part_names_text_area, placeholder: "1...\n2...\n3..."
      .required.field
        label = StyleItem.human_attribute_name :bad_values
        = f.text_area :bad_values_text_area, placeholder: "1...\n2...\n3..."

    = render 'form_submit_button', item: @param_value_option
  1. 路由也要增加
      resources :settings, only: [:index] do
        collection do
          patch :updateoptions
          post :updateoptions
        end
      end

完成了上面的mvc和routes,现在已经可以修改了
根据实际情况,对样式做了些调整,不在详细说明,本例采用了https://semantic-ui.com/

在其他view页面中调用ParamValueOption

可以直接在view中通过ParamValueOption.current调用,所有不用修改对应的controller。

  1. 增加一个选择按钮,点击按钮弹出多选页面。
a.ui.teal.button onclick="select_options('style_item_color_values_text_area', #{ParamValueOption.current.color_values})"
   = t('v1.page.admin_panel.actions.select')

modal的html代码

.ui.modal
  .header= t('v1.page.admin_panel.actions.select')
  .content.ui.form
    .inline.fields id='all_options'
  .actions
    .ui.cancel.button
      = t('v1.page.admin_panel.actions.cancel')
    .ui.positive.right.labeled.icon.approve.button
      = t('v1.page.admin_panel.actions.approve')
      i.checkmark.icon

Javascript代码

  1. 获取当前textarea里面的值
  2. 和系统参数值合并,去重复
  3. 原来textarea的checkbox显示为选中。
  4. 显示modal, 由用户选择。
  5. 用户确认回调:获取checkbox对应的label里面的值。
  6. 组合成新的值赋值给 原textarea
javascript:
  function select_options(text_area_id, sys_options) {
    var current_options = $('#'+text_area_id).val();
    var current_array = current_options.split('\n');
    var new_options = $.merge(sys_options, current_array);
    var checkbox_name = text_area_id+'[]';
    $('#all_options').html('');

    $.each(unique(new_options), function(index, value) {
      if($.inArray(value, current_array) !== -1) {
        var input = $("<input/>", {type: 'checkbox', name: checkbox_name , tabindex: index, checked: 'checked'});
      } else {
        var input = $("<input/>", {type: 'checkbox', name: checkbox_name , tabindex: index});
      }
      var label = $("<label>").text(value);
      var ui = $("<div/>", {class: 'ui checkbox'});
      var field = $("<div/>", {class: 'field'});
      ui.append(input);
      ui.append(label);
      field.append(ui)
      $('#all_options').append(field);
    });

    $('.ui.modal')
      .modal({
        onApprove : function() {
          var text_options = $("input[name='"+checkbox_name+"']:checked").map(function(){
            return $(this).parent().text().trim();
          }).get().join('\n');
          $('#'+text_area_id).val(text_options);
        }
      })
      .modal('show');
  }
  function unique(array){
    return array.filter(function(el, index, arr) {
        return index === arr.indexOf(el);
    });
  }

javascript注意事项val() 和text():

#注意一下两行的区别
var current_options = $(text_area_id).val();
var current_options = $(text_area_id).text();

#合并后的结果也赋值给了:curArray
var newArray = $.merge(curArray, [1,2]);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,833评论 1 18
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 2,704评论 1 17
  • 习惯树用户端新版接口文档 register 说明: 用户注册 参数列表: userForget 说明: 忘记密码/...
    smallnews阅读 347评论 0 0