나는 Rails의 controller,routes의 작법에 대해 생각했다.

10167 단어 Rails

개시하다


나는 이런 보도를 읽었다.
DHH는 Rails 컨트롤러를 어떻게 씁니까
https://postd.cc/how-dhh-organizes-his-rails-controllers/
나는 이 보도를 인용하여 총결하였다
"컨트롤러는 기본 CRUD 동작 index, Show, new, edit,create, 업데이트,destroy만 사용해야 합니다."
DHH 같은 사람하고 생각 중이야.
이 보도에 관한 필자는 의견을 발표하여 마음에 드는 사람에게 보여 주고 싶었다
어쨌든, 나는 컨트롤러를 작은 부분으로 나누어 기본적으로 클라우드를 써 보았다.
또 컨트롤러 증가를 막기 위해 오히려 이해하기 어렵다
사용자와 관련된 것은
users/***_controller.rb
저장되었습니다.

이루어지다


먼저
rails new app
rails g model user name
rails g controller users
.
이 정도면 됐어.달성
resources :users
이렇게 하면...
crud의 설정이 끝났습니다.

user에 status 추가


그리고user에status열을 추가합니다. 거기에enum을 사용하여active,stop의 속성을 실현합니다
rails g migration add_status_to_users
마이그레이션 파일로 사용
add_column :users, :status, :integer, default: 0
.
모델 파일에서
user.rb
enum status: { active: 0, stop: 1}
이 항목 추가
이렇게 사용자를 만들면status는active의user를 만들 수 있습니다.
여기users active user와stop user의 표시controller로 실현하는 것이 아니라 다른 컨트롤러를 만들어서 실현하는 것이다.
이때
rails g controller actives 
... 하는 것이 아니다
rails g controller users::actives
이렇게 했습니다.
이렇게 되면 controllers/users 이하 activescontroller.rb를 만듭니다.
똑같이
rails g controller users:stops
이렇게 했습니다.
다음은 루티스.rb입니다.
resources :users do 
  resources :actives, only: [:index, :create]
  resources :stops,   only: [:index, :create]
end 
이렇게 하면 controllers/이하 stops.controller.rb 좀 찾아볼게요.
다음 서류를 찾아주실 수 있도록.
resources :users do 
   scope module: :users do 
     resources :actives, only: [:index, :create]
     resources :stops,   only: [:index, :create]
   end 
end 
이렇게 하면 controllers/users 이하의 파일을 잘 만들 수 있다.
actives_controller.rb,stops_controller.rb 내용은 이런 느낌이에요.
actives_controller.rb
class Users::ActivesController < ApplicationController

    def index
        @users = User.active 
    end 

    def create 
        user = User.find params[:user_id]
        user.active!
        redirect_to users_path
    end 
end

stops_controller.rb
class Users::StopsController < ApplicationController

    def index 
        @users = User.stop
    end 

    def create 
        user = User.find params[:user_id]
        user.stop!
        redirect_to users_path
    end 
end

실제 호출할 때 삽입된routes의 URL 조수는
users/index.html.erb
<% @users.each do |user| %>
    <p><%= user.name %></p>
    <p><%= user.status %></p>
    <%= link_to "stop_user", user_stops_path(user), method: :post %>
    <%= link_to "active_user", user_actives_path(user), method: :post %>
<% end %>
이렇게 하면 돼.
위의 상황은 stops#create,actives#create에 대한routes이지만 끼워 넣은 경우
params[:id]
아니오.
params[:user_id]
구문을 사용합니다.

follow 기능


follow와 같은 기능도user와 관계가 있기 때문에users 이하의 controller.나는 rb를 만드는 것이 비교적 좋다고 생각한다.
그래서
rails g model follow user_id:integer follow_id:integer
여러 개의 동일한 데이터 저장 방지
models/follow.달성
    validate :already_follow

    def already_follow
        if Follow.exists?(user_id: user_id, follow_id: follow_id)
            errors.add(:user_id, "すでにフォローしています")
        end 
    end 
이렇게 했습니다.
그리고 나서
rails g controller users::follows
follows_controller.달성
class Users::FollowsController < ApplicationController

    def index 
        @follow_users = Follow.where(follow_id: session[:user_id]) 
    end 

    def create 
        if session[:user_id]
            follow = Follow.new(follow_id: session[:user_id], user_id: params[:user_id])
            follow.save 
            redirect_to users_path
        else 
            redirect_to users_path
        end 
    end 
end
이렇게 하면 추적 기능을 만들 수 있다.

결실


이렇게 하면user의status와followuser의 기능을 각각 controller에 따라 분리하여 제작할 수 있다.
결과로 삼다
controllers/users 이하의 컨트롤러는user와 관련이 있다는 것을 곧 알 수 있습니다
하나하나의 컨트롤러의 내용은 상당히 간단하다.
거꾸로
rails g controller follows
rails g controller actives
rails g controller stops
이렇게 디렉터를 가늘게 만들면 오히려 왠지 모를 수도 있어
만약 컨트롤러가cred만 쓴다면, 나는 반드시 끼워 넣어야 한다고 생각한다.
종결어.

좋은 웹페이지 즐겨찾기