{"id":17263030,"url":"https://github.com/ksundong/ror-playground","last_synced_at":"2026-04-30T00:33:18.044Z","repository":{"id":108683886,"uuid":"306522829","full_name":"ksundong/ror-playground","owner":"ksundong","description":null,"archived":false,"fork":false,"pushed_at":"2020-10-24T03:43:33.000Z","size":186,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-05-23T02:03:57.881Z","etag":null,"topics":["ruby-on-rails","ruby-on-rails-tutorial"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ksundong.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-10-23T03:46:36.000Z","updated_at":"2020-10-24T03:43:35.000Z","dependencies_parsed_at":"2023-04-24T15:19:56.368Z","dependency_job_id":null,"html_url":"https://github.com/ksundong/ror-playground","commit_stats":{"total_commits":27,"total_committers":1,"mean_commits":27.0,"dds":0.0,"last_synced_commit":"d14672448749126e6ff6a5e8e68857d5adfafdf1"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksundong%2Fror-playground","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksundong%2Fror-playground/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksundong%2Fror-playground/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksundong%2Fror-playground/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ksundong","download_url":"https://codeload.github.com/ksundong/ror-playground/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245568557,"owners_count":20636803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ruby-on-rails","ruby-on-rails-tutorial"],"created_at":"2024-10-15T07:55:29.409Z","updated_at":"2026-04-30T00:33:18.009Z","avatar_url":"https://github.com/ksundong.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ROR Playground\n\n루비 온 레일즈 공식문서를 보면서 레일즈를 써본다.\n\n## 레일즈의 철학\n\n- 반복하지 말라(Don't Repeat Yourself): DRY 원칙을 따른다 같은 정보를 반복해서 작성하지 않으므로써 우리의 코드는 더 유지보수하기 좋고, 더 확장가능성이 있으며, 덜 버그를 생성하게 된다.\n- 설정 위의 규칙(Convention over Configuration): Rails는 웹 애플리케이션에서의 많은 일들에 대한 가장 좋은 방법에 대한 의견이 있으며, 끝없는 설정파일들로 세부적인 것들을 설정하도록 하지 않고, 규칙들의 집합을 기본적으로 사용한다. (아마 스프링부트가 영향을 받은 대목인 것 같다.)  \n   비교 대상은 Django로 Python의 철학인 Zen of Python의 explicit is better than implicit.을 따른다.\n\n## 가이드를 따라가는데 필요한 개발 환경\n\n- Ruby(2.5.0+)\n- SQLite3\n- Node.js(8.16.0+)\n- Yarn\n\n## Rails 설치하기 / Mac에서 오류 발생시 대처법\n\n`gem install rails` 로 설치합니다.\n\n### Mac에서 발생한 문제\n\n이상하게 자꾸 rails가 설치되지 않았습니다. 인터넷의 솔루션들을 봐도 동작하지 않는 문제가 있었습니다. (내 시간...)\n\n그 이유는 Mac에 default로 설치된 ruby를 이용해 설치하려고 했기 때문이었습니다.\n\n`brew link --overwrite ruby` 를 입력했고, 혹시 몰라서 아래의 것들도 입력해주었습니다. 저는 zsh을 사용중입니다.\n\n일단 link overwrite만 적용해보시고 안된다면 아래의 것을 입력해보시기 바랍니다.\n\n```shell\necho 'export PATH=\"/usr/local/opt/ruby/bin:$PATH\"' \u003e\u003e ~/.zshrc\nexport LDFLAGS=\"-L/usr/local/opt/ruby/lib\"\nexport CPPFLAGS=\"-I/usr/local/opt/ruby/include\"\nexport PKG_CONFIG_PATH=\"/usr/local/opt/ruby/lib/pkgconfig\"\necho 'export PATH=\"'$(gem env gemdir)'/bin:$PATH\"' \u003e\u003e ~/.zshrc\n```\n\n## Rails blog 애플리케이션 만들기\n\n`rails new blog` 로 생성할 수 있습니다.\n\n`cd blog` 로 생성된 애플리케이션을 확인할 수 있습니다.\n\ndefault로 git이 자동으로 초기화 되어있습니다. \n\n## Rails 서버 구동하기\n\n`rails server` 명령어로 실행합니다.\n\n개발 모드에서는 서버를 재시작할 필요없이 변경된 파일이 자동으로 선택됩니다.\n\n## Rails로 간단한 Controller와 View 구성하기\n\n`rails generate controller Welcome index`\n\nController의 목적은 특정한 요청을 받아주는 것이고, Router가 요청을 어떤 컨트롤러에게 전달할지 결정합니다.\n\n같은 요청이지만 다른 actions로 요청이 처리될 수 있고, 각 actions의 목적은 정보를 수집(?)해서 view에 제공해주는 것입니다.\n\nView의 목적은 사람이 읽을 수 있는 형식으로 정보를 보여주는 것입니다. View에서 정보가 수집되는 것이 아니라, Controller에서 수집된다는 것이 중요한 점입니다. 뷰에는 단순히 해당 정보만 표시되어야 합니다. 기본적으로, 뷰 템플릿은 eRuby라는 언어로 작성되고, eRuby는 사용자에게 전송되기 전에 Rails의 요청 사이클에 의해 처리됩니다.(`.erb`)\n\n## Rails 루트 URL 지정하기\n\n텍스트 에디터로 `config/routes.rb` 파일을 수정합니다.\n\n`root 'welcome#index'` 를 마지막 줄(`end` 윗부분)에 추가해줍니다.\n\n## Rails로 간단한 REST 기능 구현하기\n\n`config/routes.rb` 파일에 다음과 같이 작성합니다.\n\n```ruby\nRails.application.routes.draw do\n  get 'welcome/index'\n \n  resources :articles\n \n  root 'welcome#index'\nend\n\n```\n\n`resources` 는 표준 REST resource를 정의하는 메서드입니다.\n\n`rails routes` 를 입력해봅시다. 입력하면 이미 정의된 모든 표준 RESTful action들에 대한 route들을 볼 수 있습니다.\n\n우리가 입력한건 `articles` 인데, 단수형태인 `article` 이라는 단어가 의미있게 사용됨을 알 수 있습니다.\n\n## Rails로 글 작성과 조회 기능 구현하기\n\n### 기초작업\n\n먼저, 우리는 글 작성 화면을 만들고자합니다. 주소는 `/articles/new` 가 좋겠네요.\n\n하지만 해당 주소로 접속하면, 라우팅 에러 페이지가 출력됩니다. 루트는 요청에 대해 서빙하기 위해서 컨트롤러가 필요합니다. 이 문제를 해결하는 방법은 간단합니다. `ArticlesController` 를 생성해주면 됩니다.\n\n```shell\n$ rails generate controller Articles\n```\n\n그리고 텍스트 편집기로 `app/controllers/articles_controller.rb` 를 열면 비어있는 컨트롤러를 확인하실 수 있습니다.\n\n이 컨트롤러는 `ApplicationController` 를 상속합니다. 이 컨트롤러에 메서드를 정의해 액션을 만들어줄 수 있습니다.\n\n참고로 컨트롤러는 `public` 이어야 합니다.\n\n---\n\n이제 다시 접속해보면 action을 찾을 수 없다는 오류가 나옵니다.\n\n직접 컨트롤러에 액션을 정의해주려면 `new` 라는 메서드를 컨트롤러에 정의해주면 됩니다.\n\n```ruby\nclass ArticlesController \u003c ApplicationController\n  def new\n  end\nend\n```\n\n이제 새로고침 해보면, 다른 에러가 나옵니다. 바로 요청에 대한 view를 가질 것으로 Rails가 동작하는데 해당하는 view가 없기 때문에 생기는 오류입니다.\n\n에러 메시지를 읽어보면 `articles/new` 템플릿이 없기 때문에 발생함을 알수 있습니다. API로 동작하는 경우에 `204(No Content)` 응답인 경우엔 템플릿을 필요로 하지 않음을 알 수 있습니다.\n\n레일즈는 `articles/new` 를 먼저 탐색합니다. 그 다음 `application/new` 를 탐색합니다. 왜일까요? `ArticlesController` 가  `ApplicationController` 를 상속하기 때문입니다.\n\n우리가 브라우저로 요청했기 때문에, 요청의 포맷은 `text/html` 로 결정되었습니다. 따라서 Rails는 HTML 템플릿을 찾게됩니다.\n\n이 경우에 응답해 줄 수 있는 가장 간단한 템플릿의 위치는 `app/views/articles/new.html.erb` 입니다. 파일의 확장자는 매우 중요합니다. 첫번째 확장자는 이 템플릿의 포맷을 의미하고, 두번째 확장자는 이 템플릿을 렌더하는데 사용될 핸들러를 결정합니다.\n\nRails는 `articles/new` 라는 템플릿을 `app/views` 에서 찾게됩니다. 이 포맷은 `html` 형식만 될 수 있으며, HTML 의 기본 핸들러는 `erb` 입니다. Rails는 다른 핸들러를 다른 포맷에 사용할 수 있습니다. `builder` 핸들러는 XML 템플릿을 빌드하는데 사용되고, `coffee` 핸들러는 CoffeeScript를 사용해 자바스크립트 템플릿을 빌드하는데 사용됩니다. `ERB` 는 HTML에 Ruby를 내장해서 사용할 수 있게끔 디자인 된 언어입니다. 이를 사용해 새로운 HTML 폼을 만들 수 있습니다.\n\n따라서 우리가 만들 파일은 `articles/new.html.erb` 가 됩니다. 그리고 이 파일은 `app/views` 디렉토리 안에 있어야 합니다.\n\n새로운 파일을 `app/views/articles/new.html.erb` 로 작성하세요. 그리고 다음 내용을 작성하세요.\n\n```erb\n\u003ch1\u003eNew Article\u003c/h1\u003e\n```\n\n이제 새로고침 해봅시다. 이제 페이지가 정상적으로 나오는 것을 확인할 수 있습니다.\n\n루트, 컨트롤러, 액션, 뷰가 이제 조화롭게 동작합니다! 이제 새로운 기사를 작성하기 위한 폼을 만들어야 할 때입니다.\n\n### 첫번째 폼\n\n이 템플릿으로 폼을 만들기 위해선, 폼 빌더를 사용해야 합니다. Rails에서 폼 빌더를 사용하는 첫번째 방법은 `form_with` 라는 헬퍼 메서드를 사용하는 것입니다. 이 메서드를 사용하기 위해서 다음의 코드를 `app/views/articles/new.html.erb` 에 추가하세요.\n\n```erb\n\u003c%= form_with scope: :article, local: true do |form| %\u003e\n  \u003cp\u003e\n    \u003c%= form.label :title %\u003e\u003cbr\u003e\n    \u003c%= form.text_field :title %\u003e\n  \u003c/p\u003e\n \n  \u003cp\u003e\n    \u003c%= form.label :text %\u003e\u003cbr\u003e\n    \u003c%= form.text_area :text %\u003e\n  \u003c/p\u003e\n \n  \u003cp\u003e\n    \u003c%= form.submit %\u003e\n  \u003c/p\u003e\n\u003c% end %\u003e\n```\n\n새로고침 하면 됩니다. 참 쉽죠?\n\n`form_with` 메서드를 호출하면, 이 폼을 특정하기 위한 스코프를 입력해줍니다. 여기선 `:article` 이라는 스코프를 주었어요. 이렇게 지정하면 `form_with` 헬퍼에 이 폼이 어떤 용도로 사용되는지 말해줄 수 있습니다.\n\n이 메서드의 블럭 안에는 `FormBuilder` 오브젝트가 `form` 으로 표현되어 있습니다. 이 오브젝트는 두 개의 라벨과, 두개의 텍스트 필드 그리고 `submit` 버튼으로 이루어져 있습니다.\n\n이 폼에는 하나의 문제점이 있습니다. 생성된 HTML 페이지의 소스를 확인해보면, `action` 속성이 `/articles/new` 를 가리키고 있음을 볼 수 있습니다. 이 경로는 바로 지금 있는 페이지로 이동하고, 해당 경로는 새 기사의 폼을 표시하는데만 사용되어야 하기 때문에 문제가 됩니다.\n\n이 폼은 다른 곳으로 가기 위해서 다른 URL을 필요로 합니다. 이것은 간단하게 `form_with` 의 `:url` 옵션을 지정하는 것으로 됩니다. 일반적으로 Rails에서 새로운 폼을 제출하는 액션을 \"create\" 라고 하며, 폼은 그 action을 가리켜야 합니다.\n\n`form_with` 라인을 다음과 같이 수정하세요.\n\n```erb\n\u003c%= form_with scope: :article, url: articles_path, local: true do |form| %\u003e\n```\n\n이 예제에서, `articles_path` 헬퍼는 `:url` 옵션으로 전달됩니다. Rails가 이것으로 무엇을 하는지 보기 위해서, `rails routes` 의 출력을 다시 봅시다.\n\n`articles_path` 헬퍼는 Rails에게 articles 접두사와 관련된 URI 패턴을 가리키도록 알려주고, 폼은 기본적으로 해당 경로로 `POST` 요청을 전송하도록 합니다. 이는 현재 컨트롤러인 `ArticlesController` 의 `create` 액션과 관련이 있습니다.\n\n폼과 이와 연관된 경로가 정의되었다면, 폼을 채우고, submit 버튼을 눌러 새로운 기사 생성 프로세스를 시작할 수 있습니다. 한 번 해보세요. 폼을 제출하면 익숙한 에러를 볼 수 있을겁니다.\n\n이제 `create` 액션을 `ArticlesController` 에 생성하는 것이 동작하도록 만드는 방법이겠죠?\n\n\u003e 원래 `form_with` 는 Ajax를 사용해서 전체페이지 리디렉션을 생략합니다. 이 가이드를 쉽게 만들기 위해 `local: true` 옵션으로 비활성화 했습니다.\n\n## 이런 관례는 좋아보인다.\n\n\u003e A frequent practice is to place the standard CRUD actions in each controller in the following order: `index`, `show`, `new`, `edit`, `create`, `update` and `destroy`. You may use any order you choose, but keep in mind that these are public methods; as mentioned earlier in this guide, they must be placed before declaring `private` visibility in the controller.\n\n소스코드 파악하는 속도도 좀 더 빨라질 수 있을 것 같다.\n\n## References\n\n[Ruby On Rails Refernce Document](https://guides.rubyonrails.org/getting_started.html)\n\n[Convention over Configuration wikipedia](https://en.wikipedia.org/wiki/Convention_over_configuration)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fksundong%2Fror-playground","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fksundong%2Fror-playground","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fksundong%2Fror-playground/lists"}