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

miserytan · 2017年06月19日 · 最后由 will_c_j 回复于 2017年06月20日 · 1560 次阅读

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 的部门直接在下拉列表中显示出,但又不影响其重新选择部门,我该怎么做?大神求助

在 ajax 的 callback 里面更新 dom

adamshen 回复

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

首先,我觉得你部门的 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);
          }
    });     
});

大概就是这个实现吧

miserytan 回复

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

will_c_j 回复

好,我先试一下

adamshen 回复

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

miserytan 回复

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

你这里就算不用 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)
will_c_j 回复

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

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