2012-11-16 41 views
1

這個問題必須有一個簡單的答案,但我仍然無法得到它的工作。RoR如何通過javascript函數在參數中傳遞應用程序ID

我有一個Ruby On Rails應用程序,允許用戶使用數據庫管理項目(創建,更新,顯示,編輯,銷燬等)。例如,當用戶編輯一個項目時,她/他會被帶到一個頁面,如http://:3000/projects/3/edit,他/她可以在那裏修改表單中的條目。注意在這個例子中用戶正在編輯項目3。

要編輯的項目,用戶點擊該按鈕

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

它調用此方法

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

和工作正常。

但是,我添加了另一個方法調用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> 

在控制器中,然後我就可以得到所有的信息,我需要在參數數組,如下所示:

# 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 

我的問題是,我「M無法更新的形式,並在服務器上,我看到了以下錯誤消息

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) 

如果我直接指定項目的ID,一切工作正常

@project = Project.find(3) 

我的問題是我如何通過javascript函數以params傳遞給控制器​​的方式與project_year和project_type相同?在這個例子中,它是3,但是每個項目都會有所不同,因爲它是在項目創建時分配的。

UPDATE1

<%= 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

你可以張貼則params的輸出控制器的update_field行動? ('puts params.inspect') – MrYoshiji

+0

感謝MrYoshiji爲您的及時答覆。 params.inspect輸出所有我明確傳遞給javascript函數的參數,但它們都不是項目ID,因爲我找不到正確的語法。如果你能以這種語法幫助我,我將不勝感激。謝謝 – rh4games

回答

0

您需要通過項目ID在Ajax請求的數據部分:

<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

ProjectsController試圖找到正確的Project但你不指定任何ID。您應該將id值添加到指定項目ID的$.ajaxdata值中,然後將find更改爲params[:id]

另外,您不需要額外的update_fields方法來處理Project的更新。 Rails會將任何PUT/projects/:id路由到ProjectsControllerupdate方法(假設您的路由文件中有resources :projects)。您可以使用project_url(project)(或其他存儲項目的變量)來代替$.ajax,而不必手動添加項目ID。

更多內容:您繞過了默認的方式,Rails允許您更新資源,這意味着您正在手動完成大量不需要的工作。

在視圖中,使用表單助手:

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

然後你只需要在update方法在控制器中,你大多寫在update_fields工作:

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 

當你這樣做時,form_for將生成文本字段,導致控制器獲得params[:project]中的所有內容。您不必手動提取每個屬性並應用它,就可以免費獲得所有屬性。

+0

感謝巴克爲您的及時響應。我嘗試將id:$(this).attr('project')添加到數據列表中,但它不起作用;我猜我的語法不正確,那麼在那裏得到那個「3」的正確語法是什麼?你能幫忙嗎? – rh4games

+0

您沒有足夠的視圖呈現讓我能夠具體。假設你是正確的,$(this).attr('project')'實際上會返回項目ID,只需將它添加到像這樣的'data'參數:'id:$(this).attr('project 「)'。但是,您的方法還存在其他缺陷。您正在手動設置項目年份並鍵入AJAX請求,然後在服務器上手動提取它們(但從不對它們執行任何操作)。爲什麼?爲什麼不使用內置的Rails創建表單的方式?我會用建議更新我的答案。 –

+0

再次感謝巴克的建議。 $(this).attr('project')$(this).attr('id')不傳遞正確的ID。 我想我從一開始就沒有做到這一點,現在我需要做很多改變和測試。我會在第二步做到這一點。現在,我需要向前邁進的是如何讓項目ID傳遞給updateFields? (更新1) – rh4games

相關問題