这不是老早就有了的吗
连个链接都懒得编辑,怀疑楼主的诚意。短短不到三行字,倒是罗列了不少名词。。。
赞!现在好像也就上海那边 Elixir 有 meetup 吧?Tony 哥啥时候来珠三角地区布道?
group.members << "来自广州到优秀的 React 工程师"
错别字
反正我已经点了赞!
#6 楼 @akirapanda 代码比文档好的典范,哈哈
#1 楼 @helperhaps 跟之前的极光推送的那个是异曲同工,不过至少极光那个能跑起来。
对于外包可能真是这样,客户会想,如果这个项目做完,后边又很难找到相同技术栈的人来维护,那他干嘛不一开始就找一个多人用的技术栈呢?
小波真是走遍祖国大江南北啊!
@xifengzhu 话说拍照就好好拍照啊,摸着别人腿是几个意思
沙发!!!
#6 楼 @cisolarix 在 controller action 里边放了个断点 binding.pry
。
#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
整个过程就没有任何需要往后端发送请求的必要,以上代码仅为示例,我没法运行,你自己看看吧。还不明白的话,就只能奉劝楼主老老实实重新认真学习基础知识了。
#2 楼 @zix 没有。这个问题本身不复杂也不深奥,是你没有理清楚一个请求的生命历程而已,混淆了其中的区别而已。感觉楼主需要好好阅读一下 《一次完整的 HTTP 事务是怎样一个过程?》这样的文章。
楼主没有理解渲染的机制。erb 是服务器端渲染的模板,渲染后的 HTML 下载到浏览器,浏览器才开始渲染 HTML 跟解析 js。你这种问题是倒过来的流程了,怎么可能实现呢?或者你用 ajax 的方式,先得到一个 javascript 数组,然后通过 ajax 请求将数组作为参数提交给后端,后端按照你给的参数渲染 HTML 片段,你再用 js 将这个片段替换到你想替换的位置。
无敌,无敌是多么寂寞!