• Awesome Ruby China at 2018年09月06日

    我也很推崇 @msg7086 这种分支管理方式,其要诀就是,merge 之前此分支一定要和目标分支进行 rebase,发现冲突直接在本地解决后再 push,merge。这样形成的 commit 历史会很赏心悦目。

    虽然我所有操作都是在命令行完成的,也比较推崇用命令行来使用 git,并不觉得用命令行我做不了什么复杂的事情,但我确实还是需一个 GUI 来看提交历史的 (不太喜欢用 git log)。windows 下有 gitk,但 mac 下好像没有,但有一个更好用的 gitup

  • Rails 开发 SPA 项目 at 2018年08月09日

    我是这样做的:

    export default class ApiUtil {
      static apiRequest(method, url, body) {
        const options = {
          method,
          credentials: 'include',
          headers: {
            'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
            'Accept': 'application/json',
            'Content-Type': 'application/json',
          }
        }
        if (body) {
          options['body'] = JSON.stringify(body)
        }
        return fetch(url, options)
        ...
    
  • devise 部分可以保留后端渲染,只对 devise 以外的部分进行了前后端分离。用 devise 登录以后,如果你是用 fetch 进行 API 请求,要在请求的 option 中加上 credentials: 'include',就可以在 API 请求时带上 cookie 和 session 了。

  • 受教了,目前有类似的需求,决定试试 @fan124 的方案。

  • 我的一种实践:https://ruby-china.org/topics/35505

    react-rails gem + webpacker

  • @Rei 我之前看到你的评论了,没来得及回复,现在看好像你的内容已经改过了,我印象中你之前的评论中是说了关于前后端分离的情况,不过仔细看文章我话,其实我这个实践是没有做前后分离的,就用了 React 最最简单的一个功能,作为 view,用 react component 替代了原来的 html view 模板。router 也还是 rails 的 router,数据也都是在服务端产生,通过 props 传给 react component。这种用法几乎没有对原来的整体框架产生太大的变化。(即使不需要 SSR 也可以这么用)

    一开始这样做我也是觉得有些拧巴的,但后来我体会到了一些好处,我说说我的感受。

    1. 用 react component (我一直用 jsx 语法) 替代原来的 html view 模板来写 view,表达能力和灵活性都大大加强了 (有待举个例子进行一下对比,但我觉得大家对这一点应该是认可的,毕竟一个是编程语言,一个是标记语言),阅读调试我觉得都更加方便了。在原来的模板中,以 haml 为例,你 include 另一个模板,你都没法直接在编辑器里跳转过去。
    2. 我觉得用 react 另一个最大的好处在于,组件终于能完全复用了。我把一个组件封装好后,放到 npm 上,别人 install, import 一下基本就能马上用起来了。而如果你用一个基于 jQuery 实现的组件,首先要把 js 引进来,然后你需要在 html 中至少声明一个特定的标签,还有可能必须是指定的类名或 id,然后可能还需要调一下某个 js 方法来进行一下初始化。相比 react 组件的使用就麻烦了不少。

    这是 RateYo! 的使用示例:

    <-- HTML -->
    
    <head>
      <-- Basic styles of the plugin -->
      <link rel="stylesheet" href="jquery.rateyo.css"/>
    </head>
    
    <body>
      <div id="rateYo"></div>
    
      <script src="jquery.js"></script>
      <script src="jquery.rateyo.js"></script>
    </body>
    
    /* Javascript */
    
    //Make sure that the dom is ready
    $(function () {
    
      $("#rateYo").rateYo({
        rating: 3.6
      });
    
    });
    

    这是 React-Stars 的使用:

    import ReactStars from 'react-stars'
    import React from 'react'
    import { render } from 'react-dom'
    
    const ratingChanged = (newRating) => {
      console.log(newRating)
    }
    
    render(<ReactStars
      count={5}
      onChange={ratingChanged}
      size={24}
      color2={'#ffd700'} />,
    
      document.getElementById('where-to-render')
    );
    

    (代码行数上可能是没更少,但逻辑是集中在一起,没有割裂在不同的地方)

    相比传统 html view 模板,我想缺点可能就是性能问题,这个有待 profile 一下到底差多少。但如果对性能需求不是那么高的话,又不喜欢写 html view 模板,那么值得尝试一下这种方式。

    而且如果不需要考虑 SEO,那么就不需要为 React 做 SSR,那性能会和传统 html view 模板几乎没有差别。

    以上是我的一些拙见。

  • @Littlesqx 是的,但 js 代码是不是由 node 来执行的我还不确定。

    react-rails 文档上是这么说的:

    Server rendering is powered by ExecJS and subject to some requirements

    (https://github.com/reactjs/react-rails#server-side-rendering)

    而 ExecJS 是支持多种服务端的运行时的:

    ExecJS supports these runtimes:

    • therubyracer - Google V8 embedded within Ruby
    • therubyrhino - Mozilla Rhino embedded within JRuby
    • Duktape.rb - Duktape JavaScript interpreter
    • Node.js
    • Apple JavaScriptCore - Included with Mac OS X
    • Microsoft Windows Script Host (JScript)
    • Google V8
    • mini_racer - Google V8 embedded within Ruby

    (https://github.com/rails/execjs)

  • @qq2729877005 @uestc_bird

    rails 的默认行为是转义,如果你想输出富文本,又想保证安全,用 sanitize !

    你可以再看一下这个帖子:https://ruby-china.org/topics/16633 我在后面有追加提问。

  • 别用 raw 和 html_safe at 2018年02月07日

    @jasl ,有点明白了,是不是可以这样理解。

    转义并不能输出富文本,它输出的是原始文本。

    如果你想输出富文本,简单粗暴的方法是 <% raw danger_string %> 来实现的,但这样会有安全影患,所以要用 sanitize 来将富文本中危险的标签,比如 <script> 过滤掉。

    got it! 谢谢!

  • 别用 raw 和 html_safe at 2018年02月07日

    另外,好奇一下论坛帖子的排序顺序是怎么样的,为什么这个帖子有新的回复,我再回到社区首页,却找不到这个帖子呢?