Rails에서 부울 매개 변수를 어떻게 사용합니까?
show_all
값 으로 매개 변수 를 제출하고 true
있습니다. 이 값은 모델과 관련이 없습니다.
내 컨트롤러는이 매개 변수를 인스턴스 변수에 할당합니다.
@show_all = params[:show_all]
그러나, @show_all.is_a? String
및 if @show_all == true
항상 실패합니다.
Rails는 어떤 값을 부울로 구문 분석합니까? 내 매개 변수가 있다는 것이 아니라 부울임을 명시 적으로 수있는 방법은 무엇입니까?
나는 열정적 인 답변에 의견을 말하고 싶었지만 할 수 답변으로 게시하겠습니다.
사용하는 경우
@show_all = params[:show_all] == "1"
그러면 문 자체가 참 또는 거짓으로 평가되어 삼항 연산자가 필요하지 ? true : false
않기 때문에 삭제할 수 있습니다 params[:show_all] == "1"
.
업데이트 : Rails 5 :
ActiveRecord::Type::Boolean.new.deserialize('0')
업데이트 : Rails 4.2에는 공용 API가 있습니다.
ActiveRecord::Type::Boolean.new.type_cast_from_user("0") # false
이전 답변 :
ActiveRecord는 https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/column.rb 에서 true / false에 대한 표현 목록을 유지합니다.
2.0.0-p247 :005 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean("ON")
2.0.0-p247 :006 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean("F")
이것은 Rails의 공용 API의 일부가 아니 인 도우미 메서드로 래핑되었습니다.
class ApplicationController < ActionController::Base
private
def parse_boolean(value)
ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
end
기본 테스트를 추가했습니다.
class ApplicationControllerTest < ActionController::TestCase
test "parses boolean params" do
refute ApplicationController.new.send(:parse_boolean, "OFF")
assert ApplicationController.new.send(:parse_boolean, "T")
end
end
이 질문은 오래된 오래된, 그러나 나는이 문제에 몇 번 번 클릭 제안 된 솔루션의 어떤처럼 없습니까? 뭔가 자신이 해킹 사실 '에'예 '예'등을 사용할 수 없습니다. 및 그 반대는 거짓입니다.
Monkey는 String 클래스를 패치하고, 오류를 부울로 변환하는 메소드를 추가하고, /config/initializers
여기에 제안 된 대로이 파일을 넣습니다 : Rails 3의 Monkey Patching
class String
def to_bool
return true if ['true', '1', 'yes', 'on', 't'].include? self
return false if ['false', '0', 'no', 'off', 'f'].include? self
return nil
end
end
값이 true 또는 false입니다. 유효한 값이 아니면 nil을 반환합니다. ?paid=false
(지불되지 않은 모든 기록을 반환) 검색하는 것이 (지불 ?paid=
해야하는지 여부를 지정하지 않으므로 이것을 폐기하십시오)와 동일하지 않습니다.
그런 다음이 예제에 따라 컨트롤러의 논리는 다음과 가변됩니다.
Something.where(:paid => params[:paid].to_bool) unless params[:paid].try(:to_bool).nil?
매우 깔끔하고 컨트롤러 / 모델을 깨끗하게 유지하는 데 도움이됩니다.
@show_all = params[:show_all] == "1" ? true : false
체크 박스에서 값을 전달하는 경우 작동합니다. 해시에서 누락 된 키는 조건부에서 거짓으로 평가되는 키가 없습니다.
편집하다
여기서 지적했듯이 삼항 연산자는 필요 하지 않습니다.
@show_all = params[:show_all] == "1"
평등 성명을 다음과 같이 설명 수 있습니다.
@show_all == "true"
부울이 많은 곳에서 클래스를 변환 할 수 있습니다.
가장 간단한 해결책은 문자열 표현에 대해 "부울"매개 변수를 테스트하는 것입니다.
@show_all = params[:show_all]
if @show_all.to_s == "true"
# do stuff
end
Rails가 매개 변수를 String "true"또는 "false"로 전달하는지, 실제 TrueClass 또는 FalseClass로 전달하는지에 관계없이이 테스트는 항상 작동합니다.
또 다른 방법은 값없이 키만 전달하는 것입니다. 사용 ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
은 매우 깔끔 하지만 param 키에 값을 할당하는 것이 중복되는 상황이있을 수 있습니다.
다음 사항을 고려하십시오. 기본적으로 제품 인덱스보기에서 범위가 지정된 제품 컬렉션 (예 : 재고에있는 제품) 만 표시하려고합니다. 즉, 모든 제품을 반환하려면 부울 값에 대한 매개 변수를 보내고 myapp.com/products?show_all=true
형변환 할 수 있습니다 show_all
.
그러나 반대의 옵션 myapp.com/products?show_all=false
은 반환했을 때와 동일한 제품 컬렉션을 반환하므로 의미가 없습니다 myapp.com/products
.
대안:
범위가 지정되지 않은 전체 컬렉션을 반환하려면 myapp.com/products?all
컨트롤러에서
private
def show_all?
params.key?(:all)
end
키가 params에 있으면 값에 관계없이 모든 제품을 반환해야하며 값을 형변환 할 필요가 없음을 알 수 있습니다.
다음과 같이 모든 부울 매개 변수를 실제 부울로 변환 할 수 있습니다.
%w(show_all, show_featured).each do |bool_param|
params[bool_param.to_sym] = params[bool_param.to_sym] == "true"
end
이 솔루션에서 nil 매개 변수는 거짓이됩니다.
모델에 다음을 추가 할 수 있습니다.
def show_all= value
@show_all = ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
참고 URL : https://stackoverflow.com/questions/3673607/how-do-i-submit-a-boolean-parameter-in-rails
'ProgramingTip' 카테고리의 다른 글
PostgreSQL에서 두 날짜 사이에 시계열 생성 (0) | 2020.11.06 |
---|---|
Gulp의 디렉토리에서 파일을 어떻게 생성합니까? (0) | 2020.11.06 |
{% URL 사용 ??? (0) | 2020.11.06 |
AngularJS에서 전화 및 신용 카드 번호 형식 지정 (0) | 2020.11.06 |
첫 번째 활동에서 애플리케이션을 강제로 다시 시작 (0) | 2020.11.06 |