• locale 这个变量来自何方? at 2016年09月30日

    #2 楼 @dimos locale 是 actionview 里边的代理方法:

    [1] pry(#<HomeController>)> show-source locale
    
    From: /Users/martin/.rvm/gems/ruby-2.3.1/gems/actionview-5.0.0/lib/action_view/view_paths.rb @ line 11:
    Owner: ActionView::ViewPaths
    Visibility: public
    Number of lines: 2
    
    delegate :template_exists?, :any_templates?, :view_paths, :formats, :formats=,
             :locale, :locale=, :to => :lookup_context
    

    lookup_context 方法定义如下:

    def lookup_context
      @_lookup_context ||=
        ActionView::LookupContext.new(self.class._view_paths, details_for_lookup, _prefixes)
    end
    

    ActionView::LookupContext 中有相关的实现代码:

    module ActionView
      class LookupContext
        def locale
          @details[:locale].first
        end
    
        # Overload locale= to also set the I18n.locale. If the current I18n.config object responds
        # to original_config, it means that it has a copy of the original I18n configuration and it's
        # acting as proxy, which we need to skip.
        def locale=(value)
          if value
            config = I18n.config.respond_to?(:original_config) ? I18n.config.original_config : I18n.config
            config.locale = value
          end
    
          super(default_locale)
        end
      end
    end
    

    天色已晚,我就不深入研究了,反正路是这条路,还可以继续看 LookupContext 里的 self.register_detail 方法定义以及调用。

    另外,Ruby 全局变量名是用 $ 开头的,如果遇到一个看起来像变量但又有全局特性的“变量”的话,基本可以判断其实它是一个方法了。

    另外,像这种生僻方法,还是减少使用比较好,增加同一项目共同维护者的负担。还是用 I18n.locale 就好了。

  • erb 是由 ruby 在服务器端渲染的时候才能执行的代码,而 js 代码是已经在浏览器端渲染执行的了,两个渲染时机是完全不同的。楼主还是没有消化我昨晚发的回复,同一个问题,没必要开那么多帖。

  • 简单重构可以是以下这样的,我假设你渲染的页面是 app/views/players.html.erb

    <!-- app/views/players.html.erb -->
    <%= form_for(:player) do |f| %>
      <%= f.label :sum_player, "游戏人数"%>
      <%= f.number_field :sum_player, in: 1..12, class: 'form-control',id:"sumofplayer" %>
    <% end %>
    
    <button type="button" id="myButton"  class="btn btn-primary" >分配角色</button>
    
    <!-- 这个地方的代码可以去掉
    <p>
      <%= link_to "A post", playerrole_path, remote: true ,method: :post,class: "btn btn-primary"%>
    </p>
    -->
    
    <div id="role-container">
      <div id="player_role"></div>
    
      <!-- 这个按钮固定就好了,没必要像原来一样动态添加 -->
      <button type="button" id="myButton"  class="btn btn-primary" >确定角色</button>
    </div>
    
    <script>
      // 全局变量命名空间
      App ||= {};
      // 这里预先加载角色相关信息,以供后边脚本使用
      App.playerRoles = <%== render 'games/player_role', :player => [1,'bandman',3,4]  %>;
    </script>
    

    而跟这个页面配套的脚本应该是同时下载的,里边的内容改为:

    $ ->
      $playerCountInput = $('#sumofplayer')
    
      if $playerCountInput.length
        badManNumber = 2
        $playerRole = $('#player_role')
    
        gRandomArr = ( arr, num_of_badman ) ->
          for i in [0...num_of_badman]
            # 直接用随机下标就可以了,原来的方式还得整个数组重新排序,没必要
            randomIndex = parseInt(Math.random() * arr.length)
            arr[randomIndex] = 'badman'
    
        make_role_for_players = (content, num_of_badman) ->
          arr = [] # arr 的初始化放在函数里就好了,没必要放外边
          $playerRole.empty();    # 用 $.fn.empty() 方法更语义化,比起 $.fn.html("") 更舒服
    
          if content
            for num in [0...content]
              arr.push( num )
            gRandomArr(arr, num_of_badman)
            for x,index in arr
              $playerRole.append('<p>' + index + (if arr[index] == 'badman' then '内奸' else '') + '</p>');
    
        $playerCountInput.on "change", (e)->
          make_role_for_players $playerCountInput.val(), badManNumber
    

    整个过程就没有任何需要往后端发送请求的必要,以上代码仅为示例,我没法运行,你自己看看吧。还不明白的话,就只能奉劝楼主老老实实重新认真学习基础知识了。

  • #6 楼 @zix 没看出来你这个问题跟 erb 有半毛钱关系,因为你所有逻辑都不需要经过后端处理或者渲染啊,你提交了一个表单,但是你的 ruby 代码根本不需要做任何处理,这个表单对于后端来说就是废的,最后你只是返回一个 js 文件而已,这个文件里边除了 render 'games/player_role' 之外,其他全是纯 js 代码,这个文件应该是页面渲染的时候就一起给浏览器端的,而不是单独用一个 ajax 来请求啊。 这本来是一个简单问题,所有逻辑浏览器端 js 处理就完事了,结果你非得去后端绕一圈再回来,简单问题复杂化啊。

  • #4 楼 @zix 没太明白,贴下代码吧。好多概念乱蹿,你后端不是用的 Ruby,用的 Node.js?为什么“后端通过一个 js 程序进行计算”?

  • #2 楼 @zix 没有。这个问题本身不复杂也不深奥,是你没有理清楚一个请求的生命历程而已,混淆了其中的区别而已。感觉楼主需要好好阅读一下 《一次完整的 HTTP 事务是怎样一个过程?》这样的文章。

  • 楼主没有理解渲染的机制。erb 是服务器端渲染的模板,渲染后的 HTML 下载到浏览器,浏览器才开始渲染 HTML 跟解析 js。你这种问题是倒过来的流程了,怎么可能实现呢?或者你用 ajax 的方式,先得到一个 javascript 数组,然后通过 ajax 请求将数组作为参数提交给后端,后端按照你给的参数渲染 HTML 片段,你再用 js 将这个片段替换到你想替换的位置。

  • #10 楼 @lgn21st 不是的,室外更稳定,室外用的是 GPS 定位,室内用视觉定位。

  • 无敌,无敌是多么寂寞!

  • @lgn21st 我自己重新看了一遍,感觉图片都没有修好,我先取消分享了,这段时间慢慢认真修一遍再重新发出来吧。

  • #2 楼 @michael_roshen 贴 nginx 配置吧

  • #6 楼 @ruby_sky 吓得我删掉评论

  • 不过权重大小应该不影响 worker 的执行吧

    不影响 你说没有跑?你检查时的时间离你期待执行的时间过去多久了?另外,sidekiq 的 schedule 不是按精准时间执行的。可能偏离几十秒都是有可能的。

    我上周对 Sidekiq 任务调度有过简单的研究,这段时间正打算写篇文章介绍下。

  • ruby-china 熊猫牌拖鞋、方便面、短裤、内衣内裤、抱枕、双肩包

  • #10 楼 @Catherine .org 域名代表 organization,一般用于非公益性组织。哈哈,拿来卖东西就不好了。

  • 真高效!大赞!

  • #4 楼 @danielglh 呃,我其实都没来得及修复白平衡错误。。。

  • 首图是我拍的吗?😄

  • #6 楼 @Catherine 帮你 @huacnlee ,深藏功与名

  • #10 楼 @Peter 对,得有营业执照,而且也没有代办的

  • 你是只想回滚单个资源,而不是整个外层 transaction?

  • 既然是自己的改动,为什么还要合并回 Ruby China?

  • 不过有个小问题,这个 gem 里有 js 脚本,现在用的 ready 事件,在新的 Turbolinks 5 中跳转不好使,需要使用 turbolinks:load,但是这样以来对之前的 Rails 应用应该也有影响了。

    是不是可以做个判断?

  • @happyming9527 @nowherekai 为了直观理解,我写了个示例代码,可以看下:

    # test file
    array = [10]
    threads = []
    i = 1000          # 主线程中变量
    former_i = []
    latter_i = []
    
    array.each do |i|     # block 变量
      threads << Thread.new do
        10.times { former_i << (i += 1) }
      end
    end
    
    array.each do |i|     # block 变量
      threads << Thread.new do
        10.times { latter_i << (i -= 1) }
      end
    end
    
    threads.each(&:join)                   # 在继续执行前等待其他线程执行完毕
    puts "former_i: #{former_i}"
    puts "latter_i: #{latter_i}"
    puts "i in main thread: #{i}"
    

    运行结果是:

    据此,可以得出:

    1. ruby block 有自己的作用域,比如两个 .each 方法调用中的 block 中的变量 i 都没有污染主线程中的变量;
    2. 创建线程时,线程共享创建线程的代码的作用域以及内存空间等,所以线程里的 i 引用的是各自上下文代码块里的 i 变量,并非之前理解的主线程变量;
    3. 因为有作用域的保护,主线程中的 i 在整个运行过程中未被修改,仍然是 1000
    4. 代码规范上尽量避免有歧义的代码,尽管我们明确知道了 i 变量是有作用域保护,互无关系。
  • #14 楼 @happyming9527 不会,两个 i 是各自对应的 block 的局部变量,代码块也有自己的作用域,线程里引用的变量 i 是受 .each 的代码块的作用域保护的,与主线程中另一个代码块中的 i 不是同一个变量了。

  • #12 楼 @nowherekai 不会有问题,前面有 join,主线程会等待前面线程都执行完才接着执行,如果没有 join,你说的就是对的了