Rails [已解决] link_to 背后有很多黑魔法

zhutingting · 2015年01月09日 · 最后由 wpzero 回复于 2015年01月10日 · 3526 次阅读

吐个槽。发泄一下。实在受不了了。一百个问候语给 Rails 前端的黑魔法。

事情是这样的,我用 <%= link_to '退出登录', signout_path, method: "delete" %> 做一个很简单的退出登录操作。 生成的 HTML 代码是 <a rel="nofollow" data-method="delete" href="/signout">退出登录</a> 。 这就出现问题了,因为浏览器根本不知道 data-method 怎么操作。 忘了把前提告诉大家了,因为实在受不了 Rails 前端的黑魔法,所以把前端的 gem 全摘走了,连 jquery-rails 都没用。 上面报错的原因就是,data-method 的其实是 jquery_ujs 处理的,所以必须先安装这个模块。 还好可以和 jquery-rails 一起安装,算了就应着头皮试试 jquery-rails 的黑魔法吧。 结果在 application.js 加了 //= require jquery 之后,运行又跳 Sprockets::FileNotFound 的异常。

万念俱灰,这个 Sprockets 黑魔法,背后又不知道有多少黑魔法。

作为一个 Rails 新人,我只是想安安静静的享受一下 ActiveRecord,结果跳出来这么多黑魔法。

更新 2015/01/09 16:11

尝试直接把 routes 里访问登出的方法改成 get match '/signout', to: 'sessions#destroy', via: 'get' 然后摘掉 jquery-rails 模块,bundle install,添加 //= require jquery-2.1.3.min

结果页面变成:

We're sorry, but something went wrong. If you are the application owner check the logs for more information.

很不寻常啊!网上搜类似的问题都是部署在 Heroku 等生产环境遇到的。

更新 2015/01/09 22:33

发泄完之后楼主心情超级好 😄 ,谢谢大家的批评指教鼓励。

处女帖,献给 Rails 的黑魔法。

这个就是框架的代价吧,你必须遵守交通规则。

不掌握的时候是黑魔法,掌握了可就是利器了。想安静享受 AR,你可以单独用 AR。

CGI: Ruby's Bare Metal http://www.mikeperham.com/2015/01/05/cgi-rubys-bare-metal/

这个很适合楼主。

#4 楼 @Rei 果然是站在最前端的男人。

#4 楼 @Rei 这个又有点极端了,有没有 Rails 和 CGI 中和一下的 😄

#6 楼 @zhutingting sinatra 吧。约束少很多。

有必要讲一下,为啥我痛定思痛,决定完全抛弃和前端有关的一切 gem。 完全因为那些 gem 更新太快,但肯定不如原生前端项目快,新手找个你若“安好”便是晴天的教程都那么难。 就是这个问题 https://github.com/twbs/bootstrap-sass/issues/463 让我放弃 gem 使用了原生的 bootstrap 肯定会有一些人说我,你不爱鼓捣不适合编程。难道科技的进步不就是要让我这样的人也能充分享受到吗?

#7 楼 @chenge 恩。谢谢。感叹一下,果然鱼与熊掌不可兼得啊!

“决定完全抛弃和前端有关的一切 gem”还是多了解一些知识再高谈意见吧,难道写这些 gem 和用它们的人都是傻子。

用电钻,因为电钻只有一个按钮就不看说明书而受伤的人很多的

#8 楼 @zhutingting 抛开 Ruby,有哪个实际的项目是在不停不停更新自己用的前端 library? 即使 gem 更新速度 跟原生前端项目一样快,光那些 Library 的 API 变化就该改死人了

另外,没有人说过,用 Rails 的话,前端就必须要用 gem,用 bower 也完全没问题,再粗糙点直接复制粘贴都行。

不想用前端 gem 的话,就手写 html 呗。

我先试着回答一下楼主的问题:

  1. 检查你的 Gemfile 文件,确保其中有gem 'jquery-rails'
  2. 更新 Gemfile 后,执行bundle install
  3. 确保 application.js 中有//= require jquery//= require jquery_ujs
  4. 重启你的 Rails Server

更新后的内容,大概你不是用 development 模式启动的 Server? 开发模式应该是直接显示错误而不是 500 页面吧. 具体的错误内容检查一下log/*.log吧,看看到底什么错误。

然后,你到底对黑魔法这个词有多执着。作为新手不要总是抱怨,不要总觉得:哦,为什么和我想的不一样,这是黑魔法,真受不了。 来看看你眼中的黑魔法是怎么处理 data-method 的: https://github.com/rails/jquery-rails/blob/master/vendor/assets/javascripts/jquery_ujs.js#L172-L189 只有十八行,实现方法是生成一个表单然后提交。真的简单到不能再简单。这也算黑魔法的话,那简直遍地黑魔法。

Rails 是面向专业人士设计的,使用简单不代表不需要学习背景知识和练习实践。举个例子,电脑键盘很简单吧,只需要把键按下去就行了。但是!你第一次用的时候能打多快?是不是要边看键盘边看屏幕,不停地找每个键在哪里?必须经过一段时间的练习才能熟练的盲打。而学习 Rails 这样复杂的东西,更是需要很长一段时间的学习练习。

这个不是黑魔法,你没有按照标准的方法使用,出错了,不能怪框架是黑魔法吧,如果你自己实现这个功能,也会一样做的,常规实现罢了。

多学习,然后你就会越来越顺了,加油

#14 楼 @lolychee 谢谢你回复的这么仔细。

我是按照你的方法来的,可能是我删的 gem 太多了,比如 'sass-rails' 'uglifier' 'coffee-rails' 'turbolinks' 'jbuilder' 这些我都删了。我是想简单了,想让 rails 只处理后端,前端手工一下,没想到 link_to 这种常用的 helper 方法也和 jquery 有很多联系。那个错误页面我也不知道是怎么出现的,一直都是 development 环境运行 server 来着。

准备重新屡一遍用到的那些 gem,作为新手遭遇这么多大“坑”,有点浮躁了。

感谢是上面回复的所有人,不一一 @ 了

加油,继续折腾,你就搞明白了。

我以为能学到一点儿 link_to 的新招数呢,没想到是抱怨。

吐个槽。发泄一下。实在受不了了。

  • 自动化≠黑魔法,如果搞不懂的东西就是黑魔法的话那我面前这台电脑简直是黑魔法大杂烩,我都不知道怎么搞的它就亮了。这个壳子里面不知道还有多少黑魔法
  • 明明知道自己是新手还不按照路子来学一上来就自以为是删东西,能不出错才怪
  • 自己折腾出了问题不去找原因就管它叫“坑”,说的好像前人故意挖好了坑整你一样
  • 既然你讨厌 Rails 参与你的前端代码那你就不应该用 link_to,自己手写 anchor 呗
  • 什么叫“安安静静的享受一下 ActiveRecord”?既然你想“安安静静的享受一下 ActiveRecord”那为什么还要去招 Rails,只用 ActiveRecord 不就得了: ``` ruby require 'active_record' require 'mysql2' # or 'pg' or 'sqlite3'

Change the following to reflect your database settings

ActiveRecord::Base.establish_connection( adapter: 'mysql2', # or 'postgresql' or 'sqlite3' host: 'localhost', database: 'your_database', username: 'your_username', password: 'your_password' )

Define your classes based on the database, as always

class SomeClass < ActiveRecord::Base #blah, blah, blah end

Now do stuff with it

puts SomeClass.find :all some_class = SomeClass.new

很好奇楼主想安安静静的享受一下 ActiveRecord,为什么还要用 rails,如果连 AR 单独使用都不知道怎么用,那还是老老实实别乱动

#19 楼 @cqpx 多谢指教。好吐槽! 其实我知道怎么单独用 ActiveRecord。当然 ActiveRecord 也算黑魔法,不过包装的好,易学易用。多年的习惯约定没变,拿个那两年前的教程,也能够运行。这才是:

Convention Over Configuration

我只想说:支持楼主,支持 Sinatra!

黑。魔。法 这个说法有点过了吧 RESTful 和 http 请求方式的限制 以及 jquery_ujs 的工作 我觉得还是可以去了解一下的 因为就算抛开 rails,我想我也会这么用

这个。。不算黑魔法吧,只是功能的一部分,你不用就好了,rails 本来就是大、全。不会像 expressjs 和 sinatra 那样轻量,侧重点不同

需要 登录 后方可回复, 如果你还没有账号请 注册新账号