{"rsdb":{"rid":"179356","subhead":"","postdate":"0","aid":"130207","fid":"87","uid":"1","topic":"1","content":"
\u9996\u5148\u9700\u8981\u6ce8\u660e\u4e00\u70b9\uff0c\u672c\u6587\u662f\u539f\u521b\u7684\u5e76\u4e0d\u662f\u4ece\u5176\u5b83\u5730\u65b9\u8f6c\u8f7d\u3002\u6240\u6709\u7684\u6570\u636e\u662f\u6211\u4ece GitHub \u548c RubyGems \u4e0a\u7801\u4e0b\u6765\u7684\uff0c\u6570\u636e\u7684\u622a\u53d6\u65f6\u95f4\u5c31\u662f\u672c\u6587\u7684\u53d1\u5e03\u65e5\u671f\u3002<\/p> \n
\nRubyGems \u7684\u4e0b\u8f7d\u91cf\u53ef\u4ee5\u770b\u5230\u5728\u7528\u8fd9\u4e2a gem \u7684\u4eba\u6570\uff0c\u6240\u4ee5\u6570\u503c\u5f88\u5927\uff08\u8fd9\u91cc\u6536\u85cf\u7684\u4e0b\u8f7d\u91cf\u81f3\u5c11\u4f1a\u5927\u4e8e10\u4e07\u7ea7\uff09\u3002\u800c\u5728 GitHub \u4e0a\u7684\u5219\u4ee3\u8868\u5173\u6ce8\u8fd9\u4e2agem\u7684\u6e90\u7801\u7684\u4eba\u6570\uff08\u672c\u6587\u6536\u85cf\u7684\u81f3\u5c11\u662f\u8fc7 1k\u4ee5\u4e0a Star \u7684 repository\uff09<\/p> \n <\/blockquote> \n
Nokogiri<\/h2> \n
\n
- RubyGems<\/a> \u4e0b\u8f7d\u603b\u6570\uff1a54,800,674<\/strong><\/li> \n
- GitHub<\/a> \n
\n
- Star: 3,572<\/li> \n
- Fork: 502<\/li> \n <\/ul><\/li> \n <\/ul> \n
gem 'nokogiri'<\/code><\/pre> \n
\u91c7\u96c6\u6570\u636e\u662f\u6211\u4eec\u9700\u8981\u89e3\u6790\u590d\u6742\u7684 HTML \u7ed3\u6784\uff0c\u4ece\u4e2d\u83b7\u5f97\u9700\u8981\u7684\u6570\u636e\uff0cNokogiri \u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5b8c\u7f8e\u7684\u5904\u7406\u4e0d\u540c\u7f51\u9875\u4e0a\u9762\u4e0d\u540c\u7684 HTML \u7ed3\u6784\uff0c\u5e76\u4e14\u6709\u5f88\u597d\u7684\u7f16\u7801\u5904\u7406\u80fd\u529b\uff0c\u7528\u5b83\u4f60\u4e0d\u7528\u62c5\u5fc3\u9875\u9762\u662f GB2312 \u8fd8\u662f GBK \u8fd8\u662f UTF-8\uff0c\u5b83\u90fd\u5f88\u5f88\u597d\u7684\u5904\u7406\uff0c\u89e3\u6790\u7ed3\u6784\u53ef\u4ee5\u7528\u7c7b\u4f3c jQuery \u7684 CSS Selector \u7684\u65b9\u5f0f\u67e5\u627e\uff0c\u5f88\u662f\u65b9\u4fbf\u3002\u66fe\u7ecf\u7528\u8fc7 Ruby \u7684\u597d\u51e0\u4e2a\u7c7b\u4f3c\u63d2\u4ef6\uff0c\u6700\u7ec8\u53d1\u73b0 Nokogiri \u624d\u662f\u6700\u597d\u7684\u3002<\/p> \n
Faraday<\/h2> \n
\n
- RubyGems<\/a> \u4e0b\u8f7d\u603b\u6570\uff1a22,988,969<\/strong><\/li> \n
- GitHub<\/a> \n
\n
- Star: 2,868<\/strong><\/li> \n
- Fork: 422<\/strong><\/li> \n <\/ul><\/li> \n <\/ul> \n
gem 'faraday', '~> 0.9.1'<\/code><\/pre> \n
Faraday \u662f\u4e00\u4e2aHTTP\u7684\u5ba2\u6237\u7aef\uff0c\u53ef\u4ee5\u63d0\u4f9b\u4e00\u822c\u5316\u7684\u63a5\u53e3\u548c\u591a\u79cd\u7684\u9002\u914d\u5668 (\u4f8b\u5982 Net::HTTP)\u3002<\/p> \n
\u505a\u4e00\u4e9b\u7f51\u7edc\u670d\u52a1API\u96c6\u6210\u5b83\u662f\u4e00\u4e2a\u5f88\u597d\u7528\u7684\u52a9\u624b\u3002<\/p> \n
\nconn = Faraday<\/span>.new(:url<\/span> => 'http:\/\/sushi.com'<\/span>) do<\/span> |faraday|\n faraday.request :url_encoded<\/span> # form-encode POST params<\/span>\n faraday.response :logger<\/span> # log requests to STDOUT<\/span>\n faraday.adapter Faraday<\/span>.default_adapter # make requests with Net::HTTP<\/span>\nend<\/span>\n\n## GET ##<\/span>\nresponse = conn.get '\/nigiri\/sake.json'<\/span> # GET http:\/\/sushi.com\/nigiri\/sake.json<\/span>\nresponse.body\n\nconn.get '\/nigiri'<\/span>, { :name<\/span> => 'Maguro'<\/span> } # GET http:\/\/sushi.com\/nigiri?name=Maguro<\/span>\n\nconn.get do<\/span> |req| # GET http:\/\/sushi.com\/search?page=2&limit=100<\/span>\n req.url '\/search'<\/span>, :page<\/span> => 2<\/span>\n req.params['limit'<\/span>] = 100<\/span>\nend<\/span>\n\n## POST ##<\/span>\nconn.post '\/nigiri'<\/span>, { :name<\/span> => 'Maguro'<\/span> } # POST "name=maguro" to http:\/\/sushi.com\/nigiri<\/span>\n\n# post payload as JSON instead of "www-form-urlencoded" encoding:<\/span>\nconn.post do<\/span> |req|\n req.url '\/nigiri'<\/span>\n req.headers['Content-Type'<\/span>] = 'application\/json'<\/span>\n req.body = '{ "name": "Unagi" }'<\/span>\nend<\/span>\n\n## Per-request options ##<\/span>\n\nconn.get do<\/span> |req|\n req.url '\/search'<\/span>\n req.options.timeout = 5<\/span> # open\/read timeout in seconds<\/span>\n req.options.open_timeout = 2<\/span> # connection open timeout in seconds<\/span>\nend<\/span><\/code><\/pre>\n <\/div> \n
RSPEC-RAILS<\/h2> \n
\n
- RubyGems<\/a> \u4e0b\u8f7d\u603b\u6570\uff1a17,006,673<\/strong><\/li> \n
- GitHub<\/a> \n
\n
- Star 2,584<\/li> \n
- Fork 507<\/li> \n <\/ul><\/li> \n <\/ul> \n
gem 'rspec-rails', '~> 3.4'<\/code><\/pre> \n
\u5982\u679c\u6ca1\u6709\u7528\u8fc7 RSpec \u90fd\u4e0d\u80fd\u7b97\u662f\u61c2 Ruby \u5427\uff0crespec_rails \u987e\u540d\u601d\u4e49\u662f\u5c06 rspec \u96c6\u6210\u81f3 rails \u4e2d\u7684\u6d4b\u8bd5\u6846\u67b6\u4e86:<\/p> \n
\nrequire "spec_helper"<\/span>\n\ndescribe User<\/span> do<\/span>\n it "orders by last name"<\/span> do<\/span>\n lindeman = User<\/span>.create!(first_name: "Andy"<\/span>, last_name: "Lindeman"<\/span>)\n chelimsky = User<\/span>.create!(first_name: "David"<\/span>, last_name: "Chelimsky"<\/span>)\n\n expect(User<\/span>.ordered_by_last_name).to eq([chelimsky, lindeman])\n end<\/span>\nend<\/span><\/code><\/pre>\n <\/div> \n
Devise<\/h2> \n
\n
- RubyGems<\/a> \u4e0b\u8f7d\u603b\u6570\uff1a13,825,106<\/strong><\/li> \n
- GitHub<\/a> \n
\n
- Star: 14,085<\/strong><\/li> \n
- Fork: 3,085<\/strong><\/li> \n <\/ul><\/li> \n <\/ul> \n
gem 'devise', '~> 3.5', '>= 3.5.2'<\/code><\/pre> \n
Devise \u662f\u4e00\u4e2a\u7528\u4e8e\u5feb\u901f\u6784\u5efa\u57fa\u672c\u7528\u6237\u529f\u80fd\uff0c\u5982\uff1a\u6ce8\u518c\uff0c\u767b\u9646\uff0c\u627e\u56de\u5bc6\u7801\u3002 \u540c\u65f6\u5b83\u8fd8\u96c6\u6210\u4e86\u7b2c\u4e09\u65b9\u7684\u767b\u5165\u652f\u6301\uff0c\u4ee3\u7801\u4e5f\u76f8\u5f53\u7b80\u5355:<\/p> \n
\nclass<\/span> User<\/span> < ActiveRecord<\/span>::Base<\/span>\n devise :database_authenticatable<\/span>, :registerable<\/span>, :confirmable<\/span>, :recoverable<\/span>, stretches: <\/span>20<\/span>\nend<\/span><\/code><\/pre>\n <\/div> \n
Devise \u662f\u4e00\u4e2a\u5927\u96c6\u6210\u5305\uff0c\u5355\u770b\u770b\u5b83\u96c6\u6210\u4e86\u4ec0\u4e48\u5c31\u80fd\u77e5\u9053\u5230\u5927\u81f3\u4e0a\u7684\u529f\u80fd\u4e86\uff1a<\/p> \n
\n
- Database Authenticatable: \u652f\u6301\u52a0\u5bc6\u7684\u8eab\u4efd\u9a8c\u8bc1\u5e76\u80fd\u5c06\u9a8c\u8bc1\u4fe1\u606f\u5b58\u50a8\u4e8e\u6570\u636e\u5185\u3002<\/li> \n
- Omniauthable: \u96c6\u6210 OmniAuth<\/a> \u5b9e\u73b0\u4e09\u65b9\u5e73\u53f0\uff08\u5982: Twitter, Facebook, \u65b0\u6d6a\u5fae\u535a, \u817e\u8baf QQ\uff09\u8d26\u53f7\u767b\u9646\u7684\u652f\u6301\u3002<\/li> \n
- Confirmable: \u53d1\u9001\u90ae\u4ef6\u4ee5\u9a8c\u8bc1\u6ce8\u518c\u7528\u6237\u7684\u8eab\u4efd\u3002<\/li> \n
- Recoverable: \u652f\u6301\u5bc6\u7801\u91cd\u7f6e\u3002<\/li> \n
- Registerable:\u652f\u6301\u6ce8\u518c\u65b0\u7528\u6237\u3002<\/li> \n
- Rememberable: \u652f\u6301\u81ea\u52a8\u767b\u5f55<\/li> \n
- Trackable: \u53ef\u8ddf\u8e2a\u7528\u6237\u7684\u767b\u5165\u6b21\u6570\uff0c\u65f6\u95f4\u6233\u548c IP<\/li> \n
- Timeoutable: \u652f\u6301\u81ea\u52a8\u7528\u6237\u4f1a\u8bdd\u7684\u8fc7\u671f<\/li> \n
- Validatable: \u53ef\u9a8c\u8bc1\u7528\u6237\u7684\u90ae\u4ef6\u7684\u4e0e\u5bc6\u7801\u7684\u6b63\u786e\u6027\uff0c\u4e14\u53ef\u5b9a\u5236\u5316\u3002<\/li> \n
- Lockable: \u53ef\u4ee5\u9501\u5b9a\u591a\u6b21\u5c1d\u8bd5\u767b\u5f55\u5931\u8d25\u7684\u7528\u6237\u8d26\u53f7\u3002<\/li> \n <\/ul> \n
\u5982\u679c\u6ca1\u6709\u5b83\uff0c\u5149\u60f3\u60f3\u8981\u6211\u4eec\u81ea\u5df1\u6765\u7801\u4e0a\u9762\u7684\u8fd9\u4e9b\u529f\u80fd\u90fd\u591f\u6d6a\u8d39\u65f6\u95f4\u7684\u3002\u91cd\u70b9\u662f\u6bcf\u4e2a\u9879\u76ee\u90fd\u5f97\u7528\u554a\u3002<\/p> \n
FACTORY_GIRL_RAILS<\/h2> \n
\n
- RubyGems<\/a> \u4e0b\u8f7d\u603b\u6570\uff1a10,848,852<\/strong><\/li> \n
- GitHub<\/a> \n
\n
- Star: 1,427<\/strong><\/li> \n
- Fork: 158<\/li> \n <\/ul><\/li> \n <\/ul> \n
gem 'factory_girl_rails'<\/code><\/pre> \n
Factory Girl\u53ef\u80fd\u662fROR\u6d4b\u8bd5\u4e2d\u6700\u5e38\u7528\u5230\u7684\u6570\u636e\u5de5\u5382\uff0c\u6ca1\u6709\u5b83\u4e5f\u53ea\u80fd\u624b\u5de5\u5199Fixture\u4e86\u3002\u4e0d\u89e3\u91ca\u4e86\uff0c\u5b83\u592a\u5e38\u7528\u4e86\u3002<\/p> \n
\n# spec\/factories\/user.rb<\/span>\nFactoryGirl<\/span>.define do<\/span>\n factory :user<\/span> do<\/span>\n first","orderid":"0","title":"Ruby On Rails \u5e38\u7528\u7684\u7cbe\u54c1Gem\u6c47\u603b(\u4e00)","smalltitle":"","mid":"0","fname":"Ruby","special_id":"0","bak_id":"0","info":"0","hits":"7210","pages":"5","comments":"0","posttime":"2017-10-10 12:07:49","list":"1507608469","username":"admin","author":"","copyfrom":"","copyfromurl":"","titlecolor":"","fonttype":"0","titleicon":"0","picurl":"https:\/\/www.cppentry.com\/upload_files\/article\/87\/1_txiec__.png","ispic":"1","yz":"1","yzer":"","yztime":"0","levels":"0","levelstime":"0","keywords":"Ruby<\/A> Rails<\/A> \u5e38\u7528<\/A> \u7cbe\u54c1<\/A> Gem<\/A> \u6c47\u603b<\/A>","jumpurl":"","iframeurl":"","style":"","template":"a:3:{s:4:\"head\";s:0:\"\";s:4:\"foot\";s:0:\"\";s:8:\"bencandy\";s:0:\"\";}","target":"0","ip":"113.108.110.181","lastfid":"0","money":"0","buyuser":"","passwd":"","allowdown":"","allowview":"","editer":"","edittime":"0","begintime":"0","endtime":"0","description":"Ruby On Rails \u5e38\u7528\u7684\u7cbe\u54c1Gem\u6c47\u603b","lastview":"1711612917","digg_num":"3247","digg_time":"0","forbidcomment":"0","ifvote":"0","heart":"","htmlname":"","city_id":"0"},"page":"1"}