2016-02-22 115 views
0

我有用户和配对型号为这样:不能创建从表单提交新的数据库条目

class User < ActiveRecord::Base 

    enum role: [:student, :supervisor, :admin] 
has_many :students, class_name: "User", 
         foreign_key: "supervisor_id" 

    belongs_to :supervisor, class_name: "User" 

    has_and_belongs_to_many :pairings 
end 

class Pairing < ActiveRecord::Base 

    has_and_belongs_to_many :supervisor, class_name: 'User' 
    belongs_to :student, class_name: 'User' 

end 

而且从架构相关的部分(大小去除色器件领域):

ActiveRecord::Schema.define(version: 20160221222318) do 
create_table "pairings", force: :cascade do |t| 
    t.integer "supervisor_id" 
    t.integer "student_id" 
    t.string "project_title" 
    end 

    add_index "pairings", ["student_id"], name: "index_pairings_on_student_id", unique: true 
    add_index "pairings", ["supervisor_id"], name: "index_pairings_on_supervisor_id" 

    create_table "users", force: :cascade do |t| 
    t.string "name" 
    t.integer "role" 
    t.integer "supervisor_id" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 

end 

我有一个表格,其中有1个下拉框列出所有学生,1个列出所有主管。我的目标是双重的:

(1)一旦从方块中选择了一位主管和学生,获取他们的ID并将主管的ID分配给学生的supervisor_id列。 (使用AJAX修补程序请求完成)

(2)在配对表中创建一个新行,并使用来自下拉列表的ID。 (通过pairings_controllers完成创建方法)

这是我的看法:

<script> 

$("#my_special_form").submit(function(){ 
    var url = "https://stackoverflow.com/users/" + this.elements["pairing[student_id]"].value; 

    $.ajax(url, { 
    beforeSend: $.rails.CSRFProtection, 
    data: { 
     user: { 
     supervisor_id: this.elements["pairing[supervisor_id]"].value 
     } 
    }, 
    type: 'PATCH', 
    dataType: 'JSON', 
    success: function(data, textStatus, jqXHR) { 
     console.log('Success', data, textStatus, jqXHR); 
    }, 
    }); 

    return false; // cancels out the normal form submission 
}); 

</script> 


<%= form_for(Pairing.new, url: pairings_path, method: :post, html: { id: 'my_special_form' }) do |f| %> 
    <div class="field"> 
    <%= f.label :supervisor_id %> 
    <%= f.collection_select(:supervisor_id, User.where(role: 1), :id, :name) %> 
    </div> 
    <div class="field"> 
    <%= f.label :student_id %> 
    <%= f.collection_select(:student_id, User.where(role: 0), :id, :name) %> 
    </div> 
    <div class ="field"> 
    <%= f.label :project_title %> 
    <%= f.text_field :project_title %> 
    <%= f.submit %> 
<% end %> 

和控制器:

class PairingsController < ApplicationController 
    def new 
     @pairing = Pairing.new 
    end 

    def create 
    @pairing = Pairing.new(pair_params) 
    end 

    def update 
    @pairing = Pairing.find(params[:id]) 
    @pairing.update_attributes(pairing_params) 
    end 

    private 
    def pair_params 
     params.require(:pairing).permit(:supervisor_id, :student_id, :project_title) 
    end 
end 

class UsersController < ApplicationController 
    before_action :authenticate_user! 
    after_action :verify_authorized 

    def index 
    @users = User.all 
    authorize User 
    end 

    def show 
    @user = User.find(params[:id]) 
    authorize @user 
    end 

    def update 
    @user = User.find(params[:id]) 
    authorize @user 
    if @user.update_attributes(secure_params) 
     redirect_to users_path, :notice => "User updated." 
    else 
     redirect_to users_path, :alert => "Unable to update user." 
    end 
    end 

    private 

    def secure_params 
    params.require(:user).permit(:role, :supervisor_id) 
    end 

end 

我遇到的问题是,该脚本没有成功,但仍然设法更新supervisor_id字段。我尝试在没有脚本的情况下测试,看看配对表条目是否会被创建,但它仍然没有收到表单中的参数,但是一旦按下按钮就不会被提交到事务中。不知道该做什么,真的有什么帮助表示赞赏!

+0

在浏览器中打开控制台(下开发工具),然后单击该按钮来触发阿贾克斯。浏览器控制台中的错误是什么? – MilesStanfield

+0

控制台中没有显示错误,只表示XHR完成加载:PATCH。即使用户表中的supervisor_id字段得到更新,它看起来像脚本不成功并且执行完毕。这会影响控制器以某种方式创建动作 – Yoklan

回答

0

用以下方法解决了改变

<%= form_for(Pairing.new, url: new_pairing_path, method: :post, html: { id: 'pairing_form' }) do |f| %> 

的routes.rb

match '/pairings/new', to: 'pairings#create', via: [:post] 
match '/users/update', to: 'users#update', via: [:patch] 
0

您需要定义控制器响应.json并返回状态码。

respond_to do |format| 
    if @user.update_attributes(secure_params) 
     flash[:notice] = 'User was successfully edited.' 
     format.html { render action: :index } 
     format.json { render xml: @user, status: 200 } 
    else 
     format.html { render action: @user } 
     format.json { render xml: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

或者这个效果。

http://edgeapi.rubyonrails.org/classes/ActionController/Responder.html

相关问题