Rails 매개변수에 대해 이야기합시다!
유용한 이유는 무엇입니까?
사용자는 세 가지 방법으로 웹 애플리케이션에 데이터를 보낼 수 있습니다.
이 세 가지 방법은 :
- 쿼리 매개변수 사용(
"example.com/?q=bacon"
) - 양식 제출(
"/users/sign_in"
) - URL 자체 내(
"/books/1"
)
Rails에서 이 데이터에 어떻게 액세스합니까?
params
사용 .
컨트롤러 작업 내부 params
를 호출할 수 있습니다. 양식 및 URL 쿼리 데이터 액세스 .
params
란 무엇입니까? , 정확히?
ActionController::Parameters
를 반환하는 메소드입니다. 실제로는 해시와 매우 유사하게 동작합니다.
지금.
이 params
에서 하나의 값을 읽고 싶다고 가정해 보겠습니다. 해시.
방법은 다음과 같습니다. :
params[:id]
존재하는 경우 값을 얻습니다.
또는 nil
그렇지 않은 경우.
알아야 할 몇 가지 사항 :
- 필드가 비어 있는 경우 빈 문자열이 표시됩니다
params
내의 모든 값 문자열입니다. 정수로 제출된 경우에도
잘 이해하지 못하는 Rails 매개변수를 좀 더 자세히 살펴보겠습니다. 혼란과 이상한 문제의 원인이 될 수 있습니다!
Rails 규칙:양식 필드 및 매개변수
양식 필드 및 URL 매개변수가 params
에 어떻게 매핑됩니까? 키?
당신을 위한 예가 있습니다.
여기 :
<전>
이것은 /search
에 POST 요청을 보내는 간단한 검색 양식입니다. .
결과적으로 이 params
개체:
{ "q"=>"", "controller"=>"책", "action"=>"검색" }
이 "q"는 무엇입니까?
HTML 양식에 있는 입력 필드의 이름 속성입니다. .
이름은 원하는 대로 지정할 수 있습니다.
form_for
를 사용하여 양식을 만드는 경우 도우미 메서드를 사용하면 이름이 자동으로 생성되고 특정 패턴을 따릅니다.
예시 :
몇 개의 필드가 있는 # form_for(@book)는 다음과 같은 것을 생성합니다.
이 book[title]
필드 이름의 형식은 params
를 생성합니다. 값이 중첩될 해시입니다.
예를 들어 설명하겠습니다. :
{ "책"=> { "제목"=>"", "저자"=>"", "표지"=>"", "언어"=>"영어" }}
사용자가 빈 양식을 제출하면 이것이 귀하가 받게 되는 것입니다.
컨트롤러에서...
이렇게 데이터에 액세스합니다. :
params[:book][:language]# "영어"params[:book][:author]# ""
이것은 해시처럼 작동하지만 일반 해시와 달리 기호와 문자열을 모두 동등한 키로 받아들입니다.
params["book"]
¶ms[:book]
동일합니다.
매개변수를 허용하도록 경로 활성화
쿼리 매개변수 외에도 REST 스타일 매개변수를 활성화할 수도 있습니다.
Rails에서는 이것을 "동적 세그먼트"라고 부릅니다.
예를 들어 보겠습니다.
다음과 같은 경로가 있는 경우 :
'books/:id' 가져오기, 대상:'books#show'
또는 :
리소스:도서
다음과 같은 URL을 사용할 수 있습니다. :
/books/1
그런 다음 이 1
에 액세스할 수 있습니다. , id
books/:id
.
params
사용 .
좋아요 :
params[:id]
이렇게 하면 사용자가 찾고 있는 특정 리소스를 찾는 데 도움이 됩니다.
Book.find(params[:id])
강력한 매개변수 이해
다음:
데이터베이스에 개체를 저장하려고 시도하지만 작동하지 않는 것 같습니다.
레일스 서버 로그를 확인하세요.
이것을 볼 수 있음 :
허용되지 않는 매개변수::언어
이것은 무엇을 의미합니까?
Rails는 보안 기능으로 Rails 4에서 "강력한 매개변수" 시스템을 도입했습니다.
강제로 속성을 허용 목록에 추가합니다. 저장할 수 있습니다.
이렇게 하면 악의적인 사용자가 admin = true
를 설정할 수 있는 "대량 할당"이라는 문제가 방지됩니다. , 또는 일반적으로 액세스할 수 없는 다른 필드를 설정합니다.
다음과 같은 필드를 허용할 수 있습니다. :
def book_params params.require(:book).permit(:title, :author, :cover, :language)end
어떻게 작동합니까?
require
메소드는params[:book]
를 찾습니다. &없으면 오류를 발생시킵니다.permit
method는 허용되는(그러나 선택 사항인) 속성의 목록입니다.
결과적으로 새로운 params
이러한 속성으로 해시하지만 이제 데이터베이스에 저장하는 것이 분명합니다.
예 :
Book.create(book_params)
일반 Ruby 해시는 이 보안 시스템을 우회합니다.
예 :
Book.create(제목:"", 저자:"", 표지:"")
속성 이름(예:author
) 하드코딩되어 있습니다.
요약
Rails 매개변수, 작동 방식 및 Rails 프로젝트에서 올바르게 사용하는 방법에 대해 배웠습니다!
이제 연습하고 메모하고 복습할 차례입니다 🙂
읽어주셔서 감사합니다.