Rails : 자동으로 일대일 관계를 수행하는 발판
-
20-08-2019 - |
문제
내가 읽고 있는지 확실하지 않습니다 이것 맞습니다. 그러나 스캐 폴드는 전체적으로 일대일 관계를하지 않는 것 같습니다. 예를 들어, 내가 만든 경우 messages
스캐 폴드와 함께 원합니다 comments
그것에 messages
(하나 message
-> 많은 comments
), 나는 모든 것을 통과하고 바꿔야한다. 예를 들어, 나는 이것을 comment
'에스 new
보다
<% form_for(@comment) do |f| %>
이에
<% form_for([@message, @comment]) do |f| %>
그런 다음 조치를 변경하여 설정하십시오 @message
var ... 무엇보다도.
이것은 현재 스캐 폴드로 자동으로 수행 할 수 없습니다.
해결책
이것은 사실이지만 이야기의 끝이 아닙니다. 스캐 폴드에 대한 두 가지 대안이 모두 잘 작동하고 클래스 간의 관계를 자동으로 선택합니다 (Has_many와 같은 ActiveRecord 관계 표시기를 기반으로). 이러한 대안 중 하나는입니다 간소화 그리고 다른 하나는입니다 ActivesCaffold.
시스템에 사용자가 입력 한 데이터가 아닌 데이터를 입력하는 데 주로 도움이됩니다. 예를 들어, 스캐 폴드 대안 중 하나가 거의 사용되지 않은 기능에 대해 잘 작동 할 때 CRUD에 대한 완전한 UI를 구축 할 필요가없는 테이블의 관리 작업에 사용합니다. 그래도 메시지에 대한 의견을 위해 사용하고 싶지 않을 것입니다.
다른 팁
예. 스캐 폴드는 모델 및 관련 컨트롤러에서 작동합니다. 그것은 관계를 돌보거나 작동하지 않습니다.
Scaffold의 주요 목표는 CRUD가 컨트롤러 및 관련 뷰를 사용하여 모델을 사용하도록하는 것입니다. 그게 다야. 관계와 같은 다른 요구 사항은 수동으로 코딩되어야합니다.
같은 프로젝트가 있습니다 뜨내기 노동자 필드와 연관성을 모델 자체 내에 유지할 수있는 레일의 경우. 당신은 협회를 발판 할 수는 없지만 매우 가깝습니다.
당신은 등 뒤에 더 많은 응용 프로그램을 만들어이 설탕을 지불하게됩니다. 당신은 일반적으로 자신의 사전 제작 된 행동 은행에서 필요한 것을 빼고 있습니다.
일대일 관계를 유지하기 위해 무거운 레일 관리자 프레임 워크가 필요하지 않습니다.
스캐 폴딩을 사용하여 대부분의 길을 얻을 수 있습니다.
컨트롤러와 _form보기에서 조금 더 작업하면 나머지 길을 얻을 수 있습니다.
방법은 다음과 같습니다.
Story: Select a beer for a developer
In order to select a beer for a developer
As an admin
I want a mainly scaffolded interface to select that beer
Scenario 1: Select beer for new developer
Given I have clicked the <new> button and entered the developer's name
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Scenario 2: Select a different beer for existing developer
Given I have clicked the <edit> button on the index page for a particular developer
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
우리가 있다고 가정합니다 맥주 테이블:
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
그리고 a 개발자 맥주 테이블을 참조하는 외국 키 (beer_id)가있는 테이블 :
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
스캐 폴딩을 사용하여 두 테이블을 만들 수 있습니다.
$ 레일 G 스캐 폴드 맥주 이름
$ Rails G 스캐 폴드 개발자 이름 Beer_id : 정수
스캐 폴드 명령은 각 모델의 컨트롤러와 뷰를 만듭니다.
우리는 컨트롤러와보기를 수정해야합니다. 드롭 다운 메뉴를 얻으려면 각 개발자의 맥주를 선택합니다.
앱/뷰/개발자/_form.html.erb
Beer_id의 생성 된 Text_field 및 레이블을 다음으로 바꾸십시오.
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
앱/컨트롤러/개발자 _controller.rb
컨트롤러의 새 및 편집 방법 편집 :
# GET /developers/new
def new
@developer = Developer.new
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
# GET /developers/1/edit
def edit
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
스크린 샷
메모
Rails 스캐 폴딩은 훌륭합니다. 당신을 위해 생성하는 모든 파일을보십시오.
$ be rails g scaffold beer name
invoke active_record
create db/migrate/20140912144218_create_beers.rb
create app/models/beer.rb
invoke rspec
create spec/models/beer_spec.rb
invoke factory_girl
create spec/factories/beers.rb
invoke resource_route
route resources :beers
invoke scaffold_controller
create app/controllers/beers_controller.rb
invoke erb
create app/views/beers
create app/views/beers/index.html.erb
create app/views/beers/edit.html.erb
create app/views/beers/show.html.erb
create app/views/beers/new.html.erb
create app/views/beers/_form.html.erb
invoke rspec
create spec/controllers/beers_controller_spec.rb
create spec/views/beers/edit.html.erb_spec.rb
create spec/views/beers/index.html.erb_spec.rb
create spec/views/beers/new.html.erb_spec.rb
create spec/views/beers/show.html.erb_spec.rb
create spec/routing/beers_routing_spec.rb
invoke rspec
create spec/requests/beers_spec.rb
invoke helper
create app/helpers/beers_helper.rb
invoke rspec
create spec/helpers/beers_helper_spec.rb
invoke jbuilder
create app/views/beers/index.json.jbuilder
create app/views/beers/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/beers.js.coffee
invoke scss
create app/assets/stylesheets/beers.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss
기본 CRUD 작업 이상을 원할 때 어떤 파일을 수정 해야하는지 아는 것입니다.
도움이되기를 바랍니다. ~ 렉스
스캐 폴드는 발판입니다. 테이블 위의 CRUD 이외의 것을 원할 때 (발판이 무엇인지/하는 것), 생성 된 스캐 폴딩 코드를 변경하거나 직접 굴려야합니다.