新手问题 如何指定下拉列表中的值

miserytan · 发布于 2017年06月19日 · 最后由 will_c_j 回复于 2017年06月20日 · 378 次阅读
27999

ps:由于是在form表单中,不想通过提交的方式获取信息。

我通过某些前提条件选择了一些东西,然后通过ajax将值传递回controller里进行赋值,如下:

$("#user_id").on("change", function () {
    var options=$("#user_id option:selected");
    var selected = options.val();
    $.ajax({
        url: "new",
        data: {selectedid: selected}
    });     
});
def new
    @app_project = AppProject.new
    # @departments为全部部门,即使ajax传递了值,但是下拉列表中也应该是全部部门
    @departments = Department.all
    # params[:selectedid]为ajax传递的值
    if !params[:selectedid].blank?
        @user= User.where(:id => params[:selectedid])
        @departments = Department.find_by_id(@user.department.id)
        respond_to do |format|
            format.js
            format.html
        end
    end
end

下拉列表如下:

<p class="object-select"><%= f.select :department, principals_options_for_select(@departments, @app_project.departments),
                                                        :include_blank => true, :label => l(:label_app_project_department) %></p>

我想做的是将ajax传递回的值,在controller里进行查询找出相关的此值的附属信息,如:获取到user的id。通过ajax传递回controller里,查询出此user的部门信息,下拉列表正是选取部门,将此user的部门直接在下拉列表中显示出,但又不影响其重新选择部门,我该怎么做?大神求助

共收到 9 条回复
A908ae

在ajax的callback里面更新dom

27999
A908aeadamshen 回复

请问能给出具体的解答吗,谢谢

96

首先,我觉得你部门的select的value应该就是@user.department.id,如果你不需要其他部门信息就不需要再次查询department表 其次,你的@departments参数应该是@department

我的拙见 1,现在controller里添加json返回 ,例:

format.json { render :json => { :department_id => @user.department.id }

2,js里添加 callback,把从controller返回的id赋值给你的department的select的value 例:

$("#user_id").on("change", function () {
    var options=$("#user_id option:selected");
    var selected = options.val();
    $.ajax({
        url: "new",
        data: {selectedid: selected},
        success: function(data){
              $('#department_select').val(data.department_id);
          }
    });     
});

大概就是这个实现吧

A908ae
27999miserytan 回复

你看看3楼,大概就是那样。不过如果你的需求是选择用户自动同步部门,建议你可以一次性将用户的部门查询出来,用html5 data属性存在dom上,这样就不用反复的去做ajax请求。如果你真的要用ajax这种方式的话,请求一个用户属于的部门id可以另外用一个action,不要放在new里。由于ajax请求是异步的,ajax请求发起期间disable掉selector,以免由于前一次ajax请求由于各种原因滞后而引起错误。

27999
32will_c_j 回复

好,我先试一下

27999
A908aeadamshen 回复

是的,我确实是在别的antion里写的,只不过这里我随便写了一下

A908ae
27999miserytan 回复

唉,老兄,你写的确实有点随便。我不是要怼你,只是想和你探讨一下。

你这里就算不用present?,也可以用unless,尽量要避免用否定判断,这样非常没有ruby style。

if !params[:selectedid].blank?

下面你用where而不用find,我猜你是想避免id找不到的这种情况,不想raise错误。但你这样找出来是一个relation对象,你下面会有NoMethodError。

@user= User.where(:id => params[:selectedid])
@departments = Department.find_by_id(@user.department.id)
27999
32will_c_j 回复

您的解决方案完美解决我的问题,format.json这个地方少了一个中括号☺

format.json { render :json => { :department_id => @user.department.id }}
27999 miserytan 关闭了讨论 06月20日 13:03
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册