RoR如何通过javascript函数在参数中传递应用程序id

RoR如何通过javascript函数在参数中传递应用程序id,javascript,ruby-on-rails,controller,params,Javascript,Ruby On Rails,Controller,Params,这个问题一定有个简单的答案,但我还是无法让它工作 我有一个RubyonRails应用程序,允许用户使用数据库管理项目(创建、更新、显示、编辑、销毁等等)。例如,当用户编辑项目时,她/他会被带到一个页面,如http://:3000/projects/3/edit,在那里她/他可以修改表单中的条目。请注意,在本例中,用户正在编辑项目3 要编辑项目,用户单击此按钮 <td><%= button_to 'Edit', { :action => "edit", :id =>

这个问题一定有个简单的答案,但我还是无法让它工作

我有一个RubyonRails应用程序,允许用户使用数据库管理项目(创建、更新、显示、编辑、销毁等等)。例如,当用户编辑项目时,她/他会被带到一个页面,如http://:3000/projects/3/edit,在那里她/他可以修改表单中的条目。请注意,在本例中,用户正在编辑项目3

要编辑项目,用户单击此按钮

<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>
如果我直接指定项目id,一切正常

@project = Project.find(3)
我的问题是,如何通过javascript函数以与项目年和项目类型相同的方式将参数中的id传递给控制器?在本例中,它是3,但对于每个项目,它都会有所不同,因为它是在创建项目时指定的

更新1

<%= 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 %>
{:name=>“ProjectInfo”})do | f |%>
“项目\年度\类别”,:大小=>6,:样式=>“文本对齐:右”}%>

项目控制器
正在试图找到正确的
项目
,但您没有指定任何ID。您应该向指定项目ID的
$.ajax
数据
值添加一个
ID
值,然后将
查找
更改为
参数[:ID]

另外,您不需要额外的
update\u fields
方法来处理
项目的更新。Rails将把任何
PUT
发送到
/projects/:id
ProjectsController的
update
方法(假设路由文件中有
resources:projects
)。您不必将
$.ajax
指向
更新\u字段\u项目\u url
,而是使用
项目\u url(项目)
(或存储项目的任何变量),并且不必手动包含项目ID

更多说明:您绕过了Rails允许您更新资源的默认方式,这意味着您正在手动完成大量不需要的工作

在视图中,使用表单辅助对象:

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

当您这样做时,
表单_将构建文本字段,从而使控制器获取
参数[:project]
中的所有内容。您不必手动提取并应用每个属性,您可以免费获得所有属性。

您需要在ajax请求的数据部分传递项目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>

函数updateFields(){
$.ajax({
url:“”,
数据:{
项目年份:$('.project\u year\u class').val(),
项目类型:$('.project\u type\u class').val(),
id:,
}
});
}

您能否在控制器的更新字段操作中发布参数的输出?(
放置参数检查
)感谢Yoshiji先生的及时回答。inspect输出我显式传递到javascript函数中的所有参数,但没有一个是项目id,因为我无法找出正确的语法。如果你能帮我理解一下语法,我将不胜感激。感谢巴克先生的及时回复。我试图将id:$(this.attr('project')添加到数据列表中,但没有成功;我猜我的语法是不正确的,那么得到“3”的正确语法是什么呢?你能帮我吗?你还没有显示足够的视图渲染,我无法具体说明。假设
$(this.attr('project')
实际返回项目ID是正确的,只需将其添加到
数据
参数中,如下所示:
ID:$(this.attr('project')
)。然而,您的方法还有其他缺陷。您正在手动设置项目年份并输入AJAX请求,然后在服务器上手动提取它们(但从不使用它们)。为什么?为什么不使用内置的Rails方式创建表单?我会用建议更新我的答案。再次感谢你的建议$(this.attr('project')$(this.attr('id'))没有传递正确的id。我想我从一开始就没有正确地传递id,现在需要执行很多更改和测试。我将在第二步中完成。现在,我需要做的就是如何将项目id传递给updateFields?我用更多信息更新了我的帖子(更新1)。这是草率的,但请尝试:
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 %>
<%= form_for @project do |project_form| %>
    <%= project_form.text_field :year %>
    <%= project_form.text_field :type %>
<%= end %>
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
<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>