ãããã
ãã®èšäºã¯ãNodeJSéçºãžã®æ ã®åå¿è ã察象ãšããŠããã SailsJSãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãã®ãã©ãããã©ãŒã ã§éçºããåå¿è ã玹ä»ããŸãã ãã®èšäºã§ã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããåæã¹ãã«ã説æããããšãç®çãšããç°¡åãªããã°ã®äœæããã»ã¹ã«ã€ããŠèª¬æããŸããããã¯ãNodeJSã®ãããžã§ã¯ãã®åªããåºç€ã§ãã çŽ æã®ããè¯ãååã®ããã«ãJavascriptããã°ã©ãã³ã°èšèªãšNodeJSã®ãµãŒããŒå®è£ ã®åºæ¬çãªç解ãšã Sailã®åºç€ã§ããMVCã¹ããŒã ã®å°ãªããšãäž»èŠãªã¢ã€ãã¢ãæã£ãŠããããšãæãŸããã§ãã ãã¬ãŒã ã¯ãŒã¯ãããããç解ããã«ã¯ãSailsã®å ¬åŒWebãµã€ãã§ããã¥ã¡ã³ããèªãããšãã§ããŸãããŸããCailsã§Sailsã䜿çšããæ¹æ³ãååã«è©³çŽ°ã«èª¬æããŠããŸãã èšäºãæžããšããç§ã¯ã§ããã ãã·ã³ãã«ã§æå¿«ãªçŽ æãæžã蟌ãããšããŸãããããã®èšäºã§ã¯çµéšã®ãããŠãŒã¶ãŒã«ã¯æ°ããããšã¯äŒããŸããã
äœæ¥ç°å¢ã®æºå
ãŸããSailsJSãã¬ãŒã ã¯ãŒã¯èªäœãã€ã³ã¹ããŒã«ããŸããæåã¯ãNodeJSããã±ãŒãžãæ¢ã«ã€ã³ã¹ããŒã«ãããŠãããã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ã§ãããã®ãšæ³å®ãããŠããŸãã ç§ã®å Žåãç§ã®OSã¯Fedora 20ã§ããããªãã®äžéšã¯Mac OS XãUbuntuããã®ä»ã®OSã§ãããã®äŸã§ã¯ããŒã¿çã䜿çšããSailsJSãã°ããŒãã«ã«ã€ã³ã¹ããŒã«ããã³ãã³ããå ¥åããŸã
sudo npm install -g sails@beta
ãã®åŸãæ°ãããããžã§ã¯ããäœæããå¿ èŠããããŸã-Sailsã§ã¯ãããã¯ç°¡åãã€æ確ã«è¡ãããŸãã
sails new sails-blog --linker cd sails-blog/
説æããŸã-ãã©ã¡ãŒã¿
æ°ãããããžã§ã¯ããäœæããã¿ã€ãã«ããããŠãããžã§ã¯ãã®ååããã©ã¡ãŒã¿ãŒãå ¥åããŸãnew
ãããžã§ã¯ãã§ããã³ããšã³ãã®ãã¡ã€ã«ãèªåçã«æ¥ç¶ãããããã«ããŸãïŒjsãcssãimagesãªã©ãCoffeeScriptãã¡ã€ã«ãšLESSãã¡ã€ã«ãèªåçã«ã³ã³ãã€ã«ãããŸãããããéåžžã«äŸ¿å©ã§ãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã ãã®åŸãçæããããããžã§ã¯ãããããã£ã¬ã¯ããªã«ç§»åããŸãã--linker
Bootstrapã®æ¥ç¶-ããã³ããšã³ãã®æ§æãç解ããŸã
Sailsã§ã¯ãããã³ããšã³ãã®ãã¹ããæ åœããåŽã¯éåžžã«äŸ¿å©ã«ç·šæãããŠããããµãŒããŒã¯ãããžã§ã¯ãã®ã«ãŒãã«ãã/ assetãã©ã«ããŒã«ãããã¹ãŠã®ãã¡ã€ã«ã翻蚳ããŸãã ã¢ã»ãããã©ã«ããŒã®ãã¡ã€ã«èªäœã«ã¯ã»ãŒãã®ã¢ã¯ã»ã¹æš©ããããŸããæã§èª¬æããŸããç¹å®ã®image.pngç»åãé 眮ãããå Žåã¯ã asset / images /ãã£ã¬ã¯ããªã«é 眮ããŸãããã®å ŽåããµãŒããŒã®å®è¡æã«ããã®ãã¡ã€ã«ã¯Host / images /image.png ããã¯åºæ¬çãªæ å ±ã§ããã ããŒãã¹ãã©ãããã€ã³ã¹ããŒã«ããLESSã®ãœãŒã¹ãšãšãã«ã¢ãŒã«ã€ããããŠã³ããŒãããŸãïŒãã®ã¹ã¿ã€ã«èšèªã倧奜ãã§ãïŒã
ã¢ãŒã«ã€ãããlessãã©ã«ããŒãasset / styles /ã«ã¢ã³ããã¯ããŸã -ããã«ããã assets / styles / lessãã©ã«ããŒã®å Žæã«ãªããlessãã©ã«ããŒã®ååãbootstrapã«å€æŽãïŒäŸ¿å®äžïŒãbootstrapã®äž»èŠéšåãã¢ã³ããã¯ããåŸããã®ã³ããŒã®ã°ãªããæ¥ç¶ããå¿ èŠããããŸãã¢ãŒã«ã€ãããã¢ã»ããã®ã«ãŒããžã®ãã©ã³ããã©ã«ããŒïŒçŽ/ã¢ã»ãã/ãã©ã³ãïŒã ãæ°ã«å ¥ãã®
ããããããã®ãã¡ã€ã«ã«è¡ãè¿œå ããŠããŒãã¹ãã©ãããå°ç¡ãã«ããŸã
@import 'bootstrap/bootstrap';
åãimporter.lessã§ã°ãªããæ¥ç¶ããã«ã¯ãã°ãªãããã©ã³ããã©ã«ããŒã«ãããããã°ãªããå«ããã©ã«ããŒãžã®ãã¹ã瀺ãå€æ°ã宣èšããå¿ èŠããããŸã-ãã¡ã€ã«ã«æ¬¡ã®è¡ãè¿œå ããŸã
@icon-font-path: '/fonts/';
æçµçã«ããŒãã¹ãã©ãããã€ã³ã¹ããŒã«ããã«ã¯ãjquery.jsããã³boostrap.jsãã¡ã€ã«ãasset / js / dependencies / folderã«ããããããã ãã§ãã
ããã§ãããã³ããšã³ãã®æ§æãšSailsã®éçã«é¢ããæåã®ç¥èãçµäºããããã°èªäœã®éçºã«çŽæ¥é²ã¿ãŸãã
Post APIãäœæ-ã¢ãã«ãã³ã³ãããŒã©ãŒã®æåã®ç¥ãåã
ãŸããã¢ãã«ãšã³ã³ãããŒã©ãŒã§æ§æãããAPIè€åäœãäœæããŸããããã¯æçœãªçç±ã§postãåŒã³åºããŸã; APIè€åäœãäœæããã«ã¯ã次ã®ã³ãã³ããå ¥åããŸãã
sails generate api post
çæããããã¡ã€ã«ã¯ã api /ãã£ã¬ã¯ããªå ã®åãååã®ãã©ã«ããŒã«é 眮ãããŸããSailsã¯ãããã©ã«ãã§æäœå¯èœãªCRUD APIãäœæããŸãã詳现ã«ã€ããŠã¯ãSailsã説æãããããªãåç §ããŠãã ããã
ããã§ãåã«äœæããPostã¢ãã«ãéããã³ãŒãã®èšè¿°ãéå§ããŸããã¢ãã«ã§ã¯ãå±æ§åããã®ã¿ã€ããããã³ããªããŒã¿ãŒãæå®ããå¿ èŠããããŸãã 次ã«ãã¢ãã«ã®å 容ã説æããŸãã
API /ã¢ãã«/ Post.js
module.exports = { attributes: { title: { type: 'string', maxLength: 120, required: true }, description: { type: 'string', required: true }, content: { type: 'string', required: true } } };
ã¢ãã«ã®ã³ã³ããŒãã³ãã¯JSONã«éåžžã«é¡äŒŒããŠæ§ç¯ãããŠããããã atributesæ§é å ã§ç解ã§ããããã«ãéåžžã«ãããããã䟿å©ã§ããã¢ãã«ã®å±æ§ããªã¹ãããŸãããã®å Žåãã¿ã€ãã«ãçã説æãã³ã³ãã³ãã®3ã€ã®å±æ§ãå¿ èŠã§ãã 3ã€ã®ã¿ã€ããã¹ãŠã«æååããããããããŒã«ã¯2ã€ã®ããªããŒã¿ãŒããããŸãïŒmaxLengthïŒæ倧æååé·ãå¿ é ïŒæ°ããã¬ã³ãŒããäœæãããšãã«ãã®å±æ§ãå¿ èŠãã©ããïŒãã®å Žåã¯å¿ é ïŒãæ®ãã®2ã€ã®å±æ§ã«ãã©ã¡ãŒã¿ãŒãèšå®ããŸãããã¹ãŠã®å Žåã®ããªããŒã¿ãŒïŒHEXã«ã©ãŒããªããŒã¿ãŒãå«ãïŒã«ã€ããŠã¯ããã¡ãã®å šãªã¹ããã芧ãã ãã ã
ãã®ãããããŒã¿ããŒã¹å ã®ã¬ã³ãŒããšãã®æäœãæ åœããæåã®ã¢ãã«ãã³ã³ãã€ã«ããŸããã ããã§ãã³ã³ãããŒã©ãŒ-api / controllers / PostController.jsã䜿çšããŠã¡ã€ã³ã¢ã¯ã·ã§ã³ã«é²ãããšãã§ããŸãã
ã³ã³ãããŒã©ãŒã§ã®æäœã䟿å©ãªJSONãã¬ãŒã³ããŒã·ã§ã³ã§è¡ãããŸããæåã«ãããã°ã«ã§ããããšããªã¹ãããŸããããã«å¿ããŠãã¿ã¹ã¯ãã³ã³ãããŒã©ãŒèŠçŽ ã«åå²ããŸãã ç§ãã¡ã®ããã°ã¯ãçã説æä»ãã®æçš¿ã®ãªã¹ããéé ã§è¡šç€ºã§ããããã«ããå¿ èŠããããŸãïŒæåã®æ°ããæçš¿ãæåŸã®å€ãæçš¿ïŒã ãããã£ãŠãç§ã«ãšã£ãŠã¯ããããã®æ©èœã3ã€ã®ã³ã³ãããŒã©ãŒå±æ§ãšãã¬ã³ãŒãæäœã®3ã€ã®äž»ãªæ©èœã€ã³ããã¯ã¹ã«åå²ããŸãããæåŸã®10件ã®æçš¿ã衚瀺ããŸãã åç §ïŒç¹å®ã®zapsiã®å®å šãªã³ã³ãã³ãã衚瀺ããŸãã
ããŒãžããŒã·ã§ã³-ãªã¹ããåå²ãããªã¹ãã®ç¹å®ã®ã¹ã©ã€ã¹ã§ãªã¹ãã衚瀺ããŸãã è¿œå ãæŽæ°ãåé€-æžã蟌ã¿æ©èœã§ã³ãŒãã®äœæãå§ããŸãããã module.exportsã®å éš-ã³ãŒããèšè¿°ããŸãã
å ¬çäºæ¥
äœæ
create: function (req, res) { var params = { description : req.param('description'), content : req.param('content'), title : req.param('title'), } Post.create(params).exec(function (err, post) { res.redirect('/post/watch/' + post.id); if (err) return res.send(500); }); }
ãã®ã³ãŒãã§ã¯ãç解ã§ããããã«ãããŒã¿ããŒã¹ã§ã®æ°ããã¬ã³ãŒãã®äœæã«ã€ããŠèª¬æããŸã.Sailsã§è¿°ã¹ãããã«ãCRUD APIã¯ããã©ã«ãã§çµã¿èŸŒãŸããŠããŸããã€ãŸããåURLãµãã³ã³ãããŒã©ãŒã¯GETãŸãã¯POSTã䜿çšããŠãã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããSailsã¯ãã§ã«ããããåŠçã§ããŸãã
Post.create-1ïŒPostã¢ãã«ã䜿çšããcreateã¡ãœãããæ°ããã¬ã³ãŒããäœæããããšãæå³ããŸããã¬ã³ãŒãã®å±æ§ãšãã®å±æ§ã®å€ãæå®ãããªã¹ããæž¡ãå¿ èŠããããŸãããã®å ŽåãåŒæ°ã¯åŒæ°ãæž¡ãããšã§çæãããŸãã CRUDã䜿çšããå Žåããã©ã¡ãŒã¿ãŒãªã¹ãã§éä¿¡ãããã©ã¡ãŒã¿ãŒãæå®ããŸãããããè¡ãæ¹æ³ãåãããªãå Žåã¯ãæã§èª¬æããŸããã¬ã³ãŒããäœæããå Žåã¯ãã¿ã€ãã«ã®ãã©ã¡ãŒã¿ãŒãæå®ããŠPOSTãªã¯ãšã¹ãïŒããšãã°ãPostmançµç±ïŒãéä¿¡ããŸãã説æãã³ã³ãã³ã-URL / P ãã®URLã§åãå ¥ããããost / createãã©ã¡ãŒã¿ãŒã¯ãreq.paramïŒ 'parameter'ïŒã䜿çšããŠåŒã³åºãããšãã§ããŸãã 2ïŒexecã¡ãœããã§ã¯ããšã©ãŒã®äœæäžã«çºçããåŒæ°ãšããŠerrãåãå¿åé¢æ°ã䜿çšããäœæããã°ããã®ãã¹ãããã®ããŒã¿ãšããŠãã¹ãããŸãããšã©ãŒãçºçããå ŽåãããŒãž500ãçæããããã«ããã«åŠçããŸããæ£åžžã«äœæãããïŒæçš¿ããŒã¿ãåä¿¡ãããšãïŒæçš¿ã®èå¥åãURLã«æž¡ããŠãå®å šãªèª¬æïŒãã®ã³ã³ãããŒã©ãŒã以äžã§æ€èšããŸãïŒã§ããŒãžã«ãªãã€ã¬ã¯ãããŸãã
次ã®è£å©ãµãã³ã³ãããŒã©ãŒã¯ãããŒã¿æŽæ°ãµãã³ã³ãããŒã©ãŒãäœæããŸããããã¯ãæ å ±ã®ç·šéãå¿ èŠãªå Žåã«éåžžã«äŸ¿å©ã§ãã
æŽæ°ãã
update: function (req, res) { var Id = req.param('id'); var elem = { description : req.param('description'), content : req.param('content'), title : req.param('title') }; Post.update(Id, elem).exec(function (err) { if (err) return res.send(500); res.redirect('/'); }); }
ãã®å Žåã æŽæ°ã¡ãœããã¯äœæã¡ãœãããšéåžžã«äŒŒãŠããŸã-éãã¯ãæåã®åŒæ°ãã¬ã³ãŒãã®IDãæå®ããããšã§ã-ååãšåæ§ã«ãæž¡ããããã©ã¡ãŒã¿ãŒããååŸããŸãã ãã®ã³ãŒãã®æ¬è³ªã¯ãç§ãæãã«ãããªãã¯ãã§ã«ãã£ããããŸããã æåŸã«è¡ããŠãŒãã£ãªãã£ã¯ãã¬ã³ãŒãã®åé€ã§ãã
åé€ãã
delete: function (req, res) { var Id = req.param('id'); Post.destroy(Id).exec(function (err) { if (err) return res.send(500); res.redirect('/post'); }); }
ã¬ã³ãŒããåé€ããã«ã¯ã idãæå®ããã ãã§ãã
ã¡ã€ã³ããŒã+ãã¥ãŒã®æäœ
ããã§ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã®ãããã³ããéšåãäœæããããšãæ€èšããŸãããã®éšåã¯ãäŒçµ±çã«ã€ã³ããã¯ã¹ããŒãžããéå§ããŸããå€ãã®å Žåãã€ã³ããã¯ã¹ãšããŠããŒãžããŒã·ã§ã³ã¹ã©ã€ã¹ã®1ããŒãžãå²ãåœãŠãããšãã§ããŸãããåå¿è ã¯äœåãªéšåãåãæ¹ãè¯ããšæããŸãåã ã€ã³ããã¯ã¹ãããã§ãã
index: function (req, res) { Post.find() .sort('id DESC') .limit(5) .exec(function (err, posts) { if (err) return res.send(500); res.view({ posts: posts }); }); }
次ã«ãã³ãŒãã®èª¬æãéå§ããŸããfindã¡ãœããã¯ã¢ãã«å ã®ã¬ã³ãŒãã®æ€çŽ¢ãæ åœããåŒæ°ãšããŠäœãåŒã³åºããŸããããã®åŸããã¹ãŠã®ã¬ã³ãŒãããããã³ã°ã«é©ããŠããŸãããã®åŸãã¬ã³ãŒããéé ã§ãœãŒãããŸãã ãMySQLãMongoãªã©ã®ããŒã¿ããŒã¹ã䜿çšããå Žåã¯ãæãããªçç±ã§idãcreatedAtã«çœ®ãæããå¿ èŠããããŸãããªã¹ãã®æåŸã¯ãæçš¿ã®ãªã¹ãã®äž»èŠãªã»ã¯ã·ã§ã³ã®è£œåã§ã5ãšã³ããªã®å¶éããããŸãã ã¢ãã«ã䜿çšãããã¹ãŠã®æé ãå®äºãããšãæçš¿ã®ãªã¹ããç®çã®é åºãšæ°éã§è¿ããŸããããã«ããããã¥ãŒã§ããã«äœ¿çšã§ããŸãã 以åã®æäœããèŠããŠããããã«ã execã¡ãœããã§å¿åé¢æ°ã䜿çšããŠãæçµçãªããŒã¿åŠçãå®è¡ããŸãã ããã§ã¯ãããŒéšåã«ç§»ããŸããã-衚瀺ã¡ãœããã ãã¥ãŒã¡ãœããã¯ããã¥ãŒãã³ã³ãã€ã«ãããšãã«å©çšã§ãããã®ã®ãªã¹ããæž¡ã責任ããããŸãããã®å Žåããªããžã§ã¯ããªã¹ãã§ãããã¢ã¯ã»ã¹ã®ããã«ãååãã¹ããšå€ãæã€å±æ§ãªã¹ãèŠçŽ ãäœæããŸã-ç¡åé¢æ°ã«ãã£ãŠè¿ãããpostså±æ§ã
ããªã¹ãã£ãã¯ãã¥ãŒ
watch: function (req, res) { var Id = req.param('id'); Post.findOne(Id).exec(function (err, post) { if (!post) return res.send(404); if (err) return res.send(500); res.view({ post: post }); }); }
ããã§ã¯ã findOneã¡ãœãããžã®åŒæ°ãšããŠãèå¥ååŒæ°ãæž¡ããŸããããã¯ãªã¯ãšã¹ãã§ãããã代ããã«ãã¥ãŒã¡ãœããããã¢ã¯ã»ã¹ã§ããå¥ã®æçš¿ã®ããŒã¿ãè¿ããŸãã
次ã«ãããŒãžããŒã·ã§ã³ãšãã«ãŒããªã³ãã®ãã¹ã³ã³ãããŒã©ãŒãèŠãŠããã¬ãŒã³ããŒã·ã§ã³ã«çŽæ¥é²ã¿ãŸãã
page: function (req, res) { var page = req.param('page'); Post.find() .sort('id DESC') .paginate({ page : page, limit: 5 }) .exec(function (err, posts) { if (err) return res.send(500); res.view({ posts: posts }); }); }
ããã§ã¯ã ããŒãžããšã®ã¬ã³ãŒãã®å¶éãšè¡šç€ºããã¹ã©ã€ã¹ã®ããŒãžãæå®ããå¿ èŠãããåŒæ°ãšããŠJSONã䜿çšããpaginateã¡ãœãããããã«è¿œå ããç¹ãç°ãªããŸãããã€ã³ããã¯ã¹ã³ã³ãããŒã©ãŒãšã»ãŒåãã§ãã ã¹ã©ã€ã¹ããŒãžãããåçã«ãã-ããŒãžãèšå®ãããªã¯ãšã¹ãã§ããŒãžå€æ°ãäœæãã-䟿å®äžããã®åŒæ°ãgetãªã¯ãšã¹ããšããŠæž¡ã-äžèŠãªãªã¯ãšã¹ãèŠçŽ ãªãã§ãçŽæ¥ã ãã¹èšå®ã§ ãããè¡ãã«ã¯ã config / routes.jsãã¡ã€ã«ãéããŠç·šéãéå§ããŸãã module.exports.routesã«æ¬¡ãè¿œå ããŸãã
'get /post/:page': { controller: 'post', // action: 'page' // },
ããã§äœãè¡ãããŠããŸããïŒ ååãšããŠããã¹ãŠãéåžžã«ç°¡åã§ãæåã«ãªã¯ãšã¹ãã®ã¿ã€ããURLãããã³éä¿¡ãããå±æ§-ãå²ãåœãŠãŸã- ããŒãž -ã³ã³ãããŒã©ãŒã§äœ¿çšãïŒ req.paramïŒ 'page'ïŒ ïŒãã³ã³ãããŒã©ãŒã«éä¿¡ãããªãã·ã§ã³ãç°¡ç¥åããŸããïŒããè¯ããšæããŸã- / post / pageïŒpage = 2 ïŒã ããŒãžããŒã·ã§ã³ãšåæã«ããŠãŒãã£ãªãã£é¢æ°ã®åçŽåãããå¶åŸ¡ã¹ããŒã ãèšå®ããŸãã
'post /post/create': { controller: 'post', action: 'create' }, 'get /post/delete/:id': { controller: 'post', action: 'delete' }, 'post /post/update': { controller: 'post', action: 'update' }
ãããã£ãŠãPostã³ã³ãããŒã©ãŒã䜿çšããŠåºæ¬çãªæäœãè¡ããæçµçãªåãçºæ®ããããã«ããã¬ãŒã³ããŒã·ã§ã³ãèšè¿°ããã ãã§æžã¿ãŸãããããã¢ããªã±ãŒã·ã§ã³ã®é¡ã«ãªããŸãã ã³ãŒãã®ã³ã³ãã€ã«ã§åé¡ãçºçããå Žåã¯ãã³ã¡ã³ãä»ãã®Postã³ã³ãããŒã©ãŒã®ãã«ããŒãžã§ã³ãã芧ãã ããã
èŠèŽåæ°
Sailsãã¥ãŒã¯ã³ã³ãããŒã©ãŒã«ãã£ãŠèªåçã«æ§ç¯ãããPostã³ã³ãããŒã©ãŒãäœæããŸãã-ã€ãŸãããã®ã³ã³ãããŒã©ãŒã®ãã¥ãŒãæã€ãã©ã«ããŒã¯views / post / *ã«é 眮ããããã¥ãŒã«ã¯viewsã¡ãœãããæã€ãµãã³ã³ãããŒã©ãŒåããããŸã ãSailã¯JadeãHandlebarsãHAMLä»ã«ããããŸãããããã©ã«ãã§ã¯EJSãçµã¿èŸŒãŸããŠããããããã¥ãŒã¯ãã®äžã«æ§ç¯ãããŸãã viewsã«æçš¿ãã©ã«ããŒãäœæãã次ã®å 容ã®index.ejsããã³page.ejsãã¡ã€ã«ãè¿œå ããŸãã
views / post / index.ejsããã³views / post / page.ejs
<div class="container text-center"> <h2 class="text-center">MY BLOG APP</h2> <div class="row"> <div class="col-md-1"></div> <div class="col-md-10"> <% _.each(posts, function (post) { %> <div class="panel panel-default"> <div class="panel-body"> <h3 class="text-center"><%= post.title %></h3><hr> <article> <%= post.description %> </article> </div> <div class="panel-footer"> <a href="/post/watch/<%= post.id %>" class="btn btn-info">LEARN MORE</a> </div> </div> <% }) %> </div> <div class="col-md-1"> </div> <ul class="pagination"> <li><a href="/post">1</a></li> <li><a href="/post/2">2</a></li> <li><a href="/post/3">3</a></li> </ul> </div>
_.eachïŒïŒã¯æåã®ãã©ã¡ãŒã¿ãŒãå€ã®é åã§ããããã次ã®ã³ãŒã«ããã¯ã¯é åã®åäžèŠçŽ ããããŒã¿ãæäŸããŸãïŒè§åºŠããã®ng-repeatã®ãããªãã®ïŒã次ã«ãå€ãç¹°ãè¿ãããŒã¿ãæ§ç¯ããŸãã EJSã«ç²ŸéããŠãã人ã¯ãå€æ°ã®å€ãããã¹ãã§ãããã<ïŒ =ïŒ >ã§å²ããã<%%>ã§é¢æ°ãçµäºããããšãç解ããŠããŸãïŒèª¬æãéåžžã«ç°¡åãªå ŽåïŒã ã§ããããå°ãªããšãçŽæçãªã¬ãã«ã§EJSã«é¢ããæ å ±ã®ã¡ã€ã³ãããŒãç解ããŠãããšæããŸããããã§ãªãå Žåã¯ã ããã¥ã¡ã³ãã圹ç«ã¡ãŸãã æåŸã®ãã¥ãŒã¯ç¹å®ã®æçš¿ã®åäžã®è¡šç€ºã§ã-views / post / watch.ejs
ãã¥ãŒ/æçš¿/ watch.ejs
<div class="container"> <div class="panel panel-default"> <div class="panel-body text-center"> <h3><%= post.title %></h3><hr> <article> <%= post.content %> </article> </div> </div> </div>
ããã§ãããã°ã®æ©èœã®äž»èŠéšåãäœæãããŸãã-æçš¿ã®äœæãç·šéãåé€ãããŒãžããŒã·ã§ã³ãåã ã®ãšã³ããªã®è¡šç€ºãå¯èœã«ãªããŸããããçŸæç¹ã§ã¯ç®¡çããã«ã«ãšã³ããªãèŠèŠçã«äœæã§ãããã©ãŒã ã¯ãããŸãã-åå¿è åãã«ã¯ã Postmanã䜿çšããŠãã¹ãã§ããŸã以åã«ã³ãã³ãã§ãã¹ããµãŒããŒãèµ·åãã
sails lift
æåã®éšåã®çŽ æãèå³æ·±ããæçšã§ããã2çªç®ã®éšåãã»ãã·ã§ã³ã®äœæãæ¿èªãããã³ç°¡åãªç®¡çããã«ã®èšè¿°ã«ã€ããŠèª¬æããããšãæã¿ãŸããåŸ ãŠãªãå ŽåããŸãã¯ã³ãŒãã®èšè¿°æ¹æ³ã誀解ããå Žåãå®å šãªã³ã¡ã³ãä»ãã®githubã§å®å šãªãããžã§ã¯ãã³ãŒããèŠãããšãã§ããŸãããã§è¡ããããã¹ãŠã®ããšã説æããŸãã
2èšäºã®äžéš
æžé¢ã§äœ¿çšãããæçšãªãªã³ã¯ãšè³æïŒ