2012-11-16 2 views
1

이 질문에 대한 쉬운 대답이 틀림 없지만 여전히 작동하지 않습니다.RoR javascript 함수를 통해 params에 app id를 전달하는 방법

저는 사용자가 데이터베이스 (생성, 업데이트, 표시, 편집, 삭제 등)를 통해 프로젝트를 관리 할 수있는 Ruby On Rails 응용 프로그램을 보유하고 있습니다. 예를 들어 사용자가 프로젝트를 편집하면 http : // : 3000/projects/3/edit와 같은 페이지로 이동하여 편집 할 수 있습니다. 이 예에서는 사용자가 프로젝트 3을 편집하고 있습니다.

프로젝트를 편집하려면, 사용자는이 버튼이 방법을

# GET /projects/1/edit 
def edit 
    @project = Project.find(params[:id]) 
end 

전화

<td><%= button_to 'Edit', { :action => "edit", :id => project }, :method => :get %></td> 

을 클릭하고 잘 작동합니다.

그러나 updateFields라는 또 다른 메서드를 호출하여 필드가 수정 될 때 updateFields라는 JavaScript 함수가 실행되고 양식의 다른 관련 필드를 수정하는 AJAX 요청을 호출하도록했습니다. 다음은 updateFields에서 발췌 한 것입니다 : 컨트롤러에서

<script language="JavaScript" type="text/javascript"> 
function updateFields(){ 
    $.ajax({ 
     url: "<%= update_fields_projects_url %>", 
     data: { 
      project_year: $('.project_year_class').val(), 
      project_type: $('.project_type_class').val(), 

      <snip> 

     } 
    }); 
} 
</script> 

, 나는 다음과 같이 내가 PARAMS 배열에 필요한 모든 정보를 얻을 수 있습니다

# PUT /projects/1 
# PUT /projects/1.json 

def update_fields 

    @project = Project.find(params[:project]) 
    @project_year = params[:project_year] 
    @project_type = params[:project_type] 

    <snip> 

    respond_to do |format| 
    if @project.update_attributes(params[:project]) 
     format.js 
     format.html 
    else 
     format.html { render :action => "update" } 
     format.json { render :json => @project.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

을 내가 가진 문제가 있다는 것입니다 I '양식을 업데이트 할 수 아니에요, 내가 직접 프로젝트 ID를 지정하면 서버에서, 나는 다음과 같은 오류 메시지

ActiveRecord::RecordNotFound (Couldn't find Project without an ID): 
app/controllers/projects_controller.rb:101:in `update_fields' 

Rendered /var/lib/gems/1.8/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.5ms) 
Rendered /var/lib/gems/1.8/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.2ms) 
Rendered /var/lib/gems/1.8/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (10.8ms) 

를 참조, 모두가 잘

작동
@project = Project.find(3) 

내 질문은 어떻게 그 id 매개 변수가 project_year 및 project_type과 같은 방식으로 javascript 함수에 의해 컨트롤러로 전달되게합니까? 이 예제에서는 3이지만 프로젝트가 생성 될 때 할당되므로 모든 프로젝트마다 다릅니다.

갱신 1 ProjectsController 올바른 Project을 찾기 위해 노력하지만 당신은 어떤 ID를 지정하지

<%= form_for(@project, :html => {:name => "ProjectInfo"}) do |f| %> 

    <input type=button id=project_info_button_id value="Show Details" onclick="showHideDiv('project_info_id','project_info_button_id');"> 

    <div class="form input", id='project_info_id', style='display:none'> 
    <% concat "Project Year" %> 
    <%= f.text_field :ProjectYear, {:class=>"project_year_class", :Size=>6, :style=>"text-align:right"} %> 

    <snip> 

    <% end %> 
<% end %> 
+0

당신이 컨트롤러의 update_field 조치에 PARAMS의 출력을 게시 할 수 있습니까? ('puts params.inspect') – MrYoshiji

+0

신속한 답변을 해주신 MrYoshiji에게 감사드립니다. params.inspect는 javascript 함수에 명시 적으로 전달 된 모든 매개 변수를 출력하지만 올바른 구문을 파악할 수 없기 때문에 프로젝트 ID는 아무 것도 출력하지 않습니다. 그 구문을 도와 주시면 고맙겠습니다. 감사합니다 – rh4games

답변

0
당신은 아약스 요청의 데이터 섹션에서 프로젝트 ID를 전달해야

:

<script language="JavaScript" type="text/javascript"> 
function updateFields(){ 
    $.ajax({ 
     url: "<%= update_fields_projects_url %>", 
     data: { 
      project_year: $('.project_year_class').val(), 
      project_type: $('.project_type_class').val(), 
      id: <%= @project.id %>, 
      <snip> 

     } 
    }); 
} 
</script> 
+0

감사합니다 MrYoshiji. 그게 효과가 있었어! 너는 내 하루를 보냈다! – rh4games

+0

당신은 환영합니다 선생님! – MrYoshiji

0

. 프로젝트 ID를 지정하는 $.ajaxdata 값에 id 값을 추가 한 다음 params[:id]이되도록 find을 변경해야합니다.

Project에 대한 업데이트를 처리하려면 추가로 update_fields 메서드가 필요하지 않습니다. 레일스는 PUT/projects/:id으로 ProjectsControllerupdate 방법으로 라우팅합니다 (경로 파일에 resources :projects이 있다고 가정). $.ajaxupdate_fields_projects_url으로 지정하는 대신 project_url(project) (또는 프로젝트를 저장하는 변수)을 사용하면 수동으로 프로젝트 ID를 포함 할 필요가 없습니다.

기타 : 레일스가 리소스를 업데이트 할 수있는 기본 방법을 우회하고 있습니다. 즉, 수동으로 많은 작업을 수행 할 필요가 없습니다.

def update_fields 

    @project = Project.find(params[:id]) 

    respond_to do |format| 
    if @project.update_attributes(params[:project]) 
     format.js 
     format.html 
    else 
     format.html { render :action => "update" } 
     format.json { render :json => @project.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

: 당신은 단지 당신이 대부분 update_fields에서 작성한 컨트롤러에서 update 방법, 작업을 할 필요가 그런

<%= form_for @project do |project_form| %> 
    <%= project_form.text_field :year %> 
    <%= project_form.text_field :type %> 
<%= end %> 

: 뷰에서

는 폼 헬퍼를 사용 이렇게하면 form_for은 컨트롤러가 params[:project] 내에있는 모든 것을 가져 오는 텍스트 필드를 만듭니다. 수동으로 각 속성을 추출하여 적용 할 필요가 없으며 모든 속성을 무료로 가져올 수 있습니다.

+0

신속한 답변을 위해 감사합니다 벅. id : $ (this) .attr ('project')을 데이터 목록에 추가하려고 시도했지만 작동하지 않았습니다. 내 구문이 잘못된 것 같아요, 그래서 "3"거기에 올바른 구문은 무엇입니까? 좀 도와 줄 수있어? – rh4games

+0

내가보기에 충분할만큼 뷰 렌더링을 표시하지 않았습니다. '$ (this) .attr ('project')'가 실제로 프로젝트 ID를 반환 할 것이라는 가정이 맞다면 다음과 같이'data :'인수에 추가하면됩니다 :'id : $ (this) .attr ('project ')'. 그러나 귀하의 접근 방식에는 다른 결함이 있습니다. 수동으로 프로젝트 연도를 설정하고 AJAX 요청을 입력 한 다음 서버에서 수동으로 추출합니다 (단, 아무 것도하지 마십시오). 왜? 왜 양식을 만드는 내장 된 레일 방식을 사용하지 않습니까? 내 대답을 제안으로 업데이트하겠습니다. –

+0

Buck에게 다시 한번 감사드립니다. $ (this) .attr ('project') $ (this) .attr ('id')는 올바른 ID를 전달하지 않습니다. 처음부터 올바른 방법으로하지 않았으며 이제는 수행해야 할 많은 변경과 테스트가 있습니다. 나는 2 단계에서 그렇게 할 것이다. 당분간, 앞으로 나아갈 필요가있는 것은 updateFields에 전달 된 프로젝트 ID를 얻는 것입니다. 내 게시물을 더 많은 정보 (Update1)로 업데이트했습니다. – rh4games

관련 문제