2012-12-19 4 views
1

관련 모델 사용자의 국가 ID를 채우기 위해 한 번만 collection_select를 사용했습니다. 이제 다른보기에서 동일한 collection_select 문을 사용하여 사용자를 검색하고 선택한 국가의 사용자를 나열하려고합니다. 내 시도가 실패했습니다. 한 국가가 선택되면 해당 국가의 ID가 선택되었음을 알 수 있습니다. 그러나 제출 단추를 클릭하면 collection_select 문은 선택한 값을 기본 선택된 값으로 재설정하고 선택한 값을 무시합니다. 예를 들어 프랑스 국가를 선택하면 ID는 75입니다. 프랑스를 선택하고 국가 별 검색을 클릭하면 ID가 이와 같이 표시됩니다.액티브 레코드에서 검색하기 위해 collection_select 사용하기 - 레일 3.2.9

http://localhost:3000/users_admin?utf8=✓&query=&user%5Bcountry_id%5D=75 

여기는 collection_select 문이있는 양식입니다. 선택한 country_id를 사용하여 사용자 모델의 레코드를 추가/업데이트 할 때 성공적으로 사용하는 문을 복사했습니다. 내 논리가 원하는 것은 국가를 선택하고 국가 별 검색을 클릭하면 선택한 국가가 드롭 다운 목록에서 선택된 상태로 남아 있고 선택한 country_id가있는 사용자 레코드가 화면에 표시됩니다. 이름으로 검색이 예상대로 작동합니다.

<%= form_tag users_admin_path, method: 'get' do %> 
    <p style="padding-left: 20px;"> 
    <%= text_field_tag :query, params[:query], placeholder: "Search for first, last or full name" %>&nbsp;&nbsp; 
    <span valign="center"><%= submit_tag "Search by Name", class: "btn btn-medium btn-custom", :name => nil %></span>&nbsp;&nbsp;&nbsp;&nbsp; 
    <%= collection_select(:user, :country_id, Country.order('name'), :id, :name, {:selected => 233}) %>&nbsp;&nbsp; 
    <span valign="center"><%= submit_tag "Search by Country", class: "btn btn-medium btn-custom", :name => nil %> 
    </p> 
<% end %> 

다음은 컨트롤러에있는 코드입니다.

def users_admin 
    case 
    when User.where("active_user = ?", '1').count > 0 # blocked users exist 
    @users = User.where("active_user = ?", '1').all 
    when params[:commit]=='Search by Country' 
    @users = User.where("country_id = ?", params[:country_id]).all 
    else 
    @users = User.text_search(params[:query]) 
    end 
    @microposts = Micropost.all 
end 

collection_select 문이 코딩 된 방식 또는 다른 논리 문제와 관련된 문제인지 확실하지 않습니다. 내 첫 번째 생각은 어떻게 든 collection_select 문에서 선택한 값을 저장 한 다음 내 where 절에서 사용해야한다는 것입니다. 그러나 나는 그것을하기 위해 성명서를 다시 작성하는 방법을 알지 못하며 화면이 처음 표시 될 때 미국인 233이라는 기본 선택 값을 갖고있다. 나는 또한 하나가 아닌 두 가지 형태가 있어야한다고 생각했다. 나는이 시점에서 내가해야 할 방향을 모른다.

이 문제와 관련하여 주로 스택 오버플로를 검색했습니다. 대부분의 경우 collection_select와 관련된 질문은 내가 사용하게 될 것 같은 과거의 사용과 관련되어있었습니다. 다시 한 번 collection_statement 만 사용했습니다.

도움이 될 것입니다. 당신이 뭔가를 form_tag

을 시도하지 form_for @user do를 사용할 때

답변

0

당신이 (당신의 형태로 모델과 작업 할 때 collection_select 사용해야 즉 :

<%= select_tag :country_id, options_from_collection_for_select(Country.all, :id, :title, params[:country_id]), include_blank: true %> 

params[:country_id] 매개 변수는 반드시 존재한다 사용자가 검색 양식을 제출하면 드롭 다운에서 GET 요청을 통해 전달 된 country_id가 선택됩니다.

btw, form_for is use d) 관련된 모델이있을 때 (생성/업데이트 됨). 당신이 검색 양식을 만드는 경우,이 사건을하지 않습니다 그리고 당신은 form_tag

자세한 내용은이 읽기 사용한다 : 그냥에 내보기에 PARAMS를 표시하기로 결정 http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease

+0

두 개의 분리 된 양식을 만들어야하는지 궁금했습니다. 내가 사용하고있는 것은 form_for를 사용하고있다. 나는 당신이 제안한 것을하고 다시 시도 할 것입니다. 그것은 저에게 새로운 명령입니다. 정말 고마워. –

+0

위에 포함 된 코드는'form_tag'을 사용하고 있습니다 :) 어떻게 작동되는지 알려주세요. 작동하는 경우이 답변을 표시해야합니다. – regulatethis

+0

제안 된 코드가 작동합니다. 이제 다른 사람이 국가를 선택하면 국가 선택을 클릭하면 선택한 국가를 선택한 상태로 유지합니다. 이제 선택한 ID에 대한 사용자 레코드를 표시하는 방법을 알아야합니다. 커밋을 확인할 때 when 절을 완전히 무시하는 것처럼 보입니다. test.log 파일을 검사 할 때 첫 번째 절을 확인하고 건너 뜁니다. 테스트 데이터에서 가져와야합니다. 그런 다음 params [: commit] 절을 확인하지 않고 else 절로 이동합니다. params [: submit]를 사용하도록 변경했지만 동일한 결과가 나타납니다. –

0

더 검색을 수행 한 후 해시에 무엇이 있는지보십시오. 나는 submit_tag에 커밋을하지 않았으므로 params [: country_id]가 있는지 확인했습니다.나는 수정 된 코드와 협력 국가 검색 얻을 수있었습니다 :

case 
    when User.where("active_user = ?", '1').count > 0 # blocked users exist 
    @users = User.where("active_user = ?", '1').all 
    when params[:country_id].present? 
    @users = User.where("country_id = ?", params[:country_id].to_i).all 
    else 
    @users = User.text_search(params[:query]) 
end 

내가 남아있는 유일한 문제 (사소한 문제)이라는 사람이에이 검색 국가 후에 제대로 작동 이름 검색을 얻기 위하여 국가 목록에서 빈 항목을 선택하십시오. 이것 이외는 해결됩니다. params [: country_id]에서 값을 삭제하는 방법을 파악하는 데 오래 걸리지 않습니다. 어느 쪽이든 아니면 params [: query] .present에 대한 암시 적 검사를 수행 할 수 있습니까? . 당신의 도움을 주셔서 감사합니다. 또 다른 한 쌍의 눈은 실제로 도움이되었습니다.

관련 문제