Ruby on rails ruby on rails参数缺失或值为空(与angularJS表单一起使用时)

Ruby on rails ruby on rails参数缺失或值为空(与angularJS表单一起使用时),ruby-on-rails,ruby,require,Ruby On Rails,Ruby,Require,我是RubyonRails的新手,目前正在开发门户的一部分。我遇到了一些我找不到解决办法的错误 第一个错误: ActionController::ParameterMissing (param is missing or the value is empty: user): app/controllers/admin/manage_users_controller.rb:97:in `user_params' app/controllers/admin/manage_users_controll

我是RubyonRails的新手,目前正在开发门户的一部分。我遇到了一些我找不到解决办法的错误

第一个错误:

ActionController::ParameterMissing (param is missing or the value is empty: user):
app/controllers/admin/manage_users_controller.rb:97:in `user_params'
app/controllers/admin/manage_users_controller.rb:32:in `update'
第二个错误:

ArgumentError (When assigning attributes, you must pass a hash as an argument.):
app/controllers/admin/manage_users_controller.rb:32:in `update'
我的管理用户控制器:

def edit
  if request.format.json?
   t = @user
   @user = {:id => t.id, :email => t.email}
  end
  respond_to do |format|
    format.json { render :json => @user, :status => 200}
    format.html
  end
 end

def update
  @user.attributes = user_params
  if @user.save
   respond_to do |format|
    format.json {render :json => {:redirect_to => admin_manage_users_path}, :status => 200 }
   end
  else
   respond_to do |format|
    format.json { render :json => {:errMsg => print_out_message('form-update','user'), :errors => @user.errors}, :status => 400 } 
   end
  end
 end

 def user_params  
  return params.require(:user).permit(:user_id, :email)
 end
对于第一个错误,我不确定为什么缺少param。 对于第二个错误,我在其他帖子上读到,我需要在我的用户参数中使用require和permit方法。然而,我仍然无法弄清楚到底是什么问题

任何帮助都将不胜感激。多谢各位

--------------------------更新-----------------------------

在视图中编辑.html.erb

  <div class="row" ng-controller="AdminManageUsersCtrl">
     <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
      <div class="rs-content" data-ng-init="loadUser()">
       <div class="portlet listing" cg-busy="loadUser" ng-cloak>
         <div class="portlet-body">
          <form name="form" ng-submit="uploadUser()" confirm-on-exit>
           <%= render "admin/manage_users/form" %>
           <div class="row row-space-top-1">
            <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
             <button type="submit" class="btn red-mint" ng-click="form.$setPristine()">Update</button>
             <%= link_to "Cancel".html_safe, admin_manage_users_path, :class => "btn dark btn-outline" %>
             <%= link_to 'Remove', URI::unescape(admin_manage_user_path(:users => '{{user.id}}')), :method => :delete, :class => "pull-right btn red btn-outline", :data => {:confirm => 'Are you sure you want to delete this user?', "ng-click"=>"form.$setPristine()"} %>
            </div>
           </div>
          </form>
         </div>
       </div>
      </div>
     </div>
    </div>
这是route.rb中的路由

  resources :manage_users, :only => [:index,:destroy], :param => :id
   match "manage_users/data" => "manage_users#data", via: [:post], :defaults => { :format => 'json' }
   match "manage_users/load" => "manage_users#load", via: [:get], :defaults => { :format => 'json' }
   match "manage_users/:id/edit" => "manage_users#edit", via: [:get]
   match "manage_users/:id/update" => "manage_users#update", via: [:patch]
对不起,我张贴了很多代码,但我认为它们都是相关的。
老实说,我实际上是在尝试遵循导师采用的编码风格,所以他使用angularJS来设计表单,所以我仍然很难理解所有东西是如何链接在一起的

错误本身是由您的方法引起的:

具体来说,require参数意味着控制器需要一个params散列,该散列将
“user”
作为主要元素:

params: {
  "user" => {
    "user_id" => "1",
    "email"   => "test@email.com"
  }
}
由于没有进行上述设置,错误返回,即params散列中没有
用户


解决方案

确保通过参数传递的对象正确。您应该进行以下设置:

#app/views/admin/manage_users/edit.html.erb
<%= form_for @user do |f| %>
   <%= f.text_field :email %>
   <%= f.submit %>
<% end %>
#app/views/admin/manage_users/edit.html.erb
除此之外,你做这件事的整个方式都是有缺陷的;您最好使用以下方法:

#app/controllers/admin/manage_users_controller.rb
class Admin::ManageUsersController < ApplicationController 
   respond_to :js, :json, :html
   before_action :set_user

   def edit
     respond_with @user
   end

   def update
      respond_to do |format|

        if @user.update user_params
          format.json {render :json => {:redirect_to => admin_manage_users_path}, :status => 200 }
        else
          format.json { render :json => {:errMsg => print_out_message('form-update','user'), :errors => @user.errors}, :status => 400 } 
        end

     end
   end

   private

   def set_user
      @user = User.find params[:id]
   end

   def user_params  
       params.require(:user).permit(:user_id, :email) #-> Ruby automatically returns the last line of a method
   end
end
#app/controllers/admin/manage_users_controller.rb
类Admin::ManageUsersController{:redirect\u to=>admin\u manage\u users\u path},:status=>200}
其他的
format.json{render:json=>{:errMsg=>打印消息('form-update','user'),:errors=>@user.errors},:status=>400}
结束
结束
结束
私有的
def set_用户
@user=user.find参数[:id]
结束
def用户参数
params.require(:user.permit(:user_id,:email)#->Ruby自动返回方法的最后一行
结束
结束

请在问题中发布您的表单代码和生成的参数。我是ruby on rails的新手-欢迎,感谢您耐心地提出问题而不是放弃!我在app.js中找到了错误,我在那里创建了ManageUserFactory方法。我在工厂方法中将名称指定为“manage_user”,但在控制器中,我将(:user)传递给参数。我应该将“manage_user”传递给参数,问题就解决了。谢谢
params: {
  "user" => {
    "user_id" => "1",
    "email"   => "test@email.com"
  }
}
#app/views/admin/manage_users/edit.html.erb
<%= form_for @user do |f| %>
   <%= f.text_field :email %>
   <%= f.submit %>
<% end %>
#app/controllers/admin/manage_users_controller.rb
class Admin::ManageUsersController < ApplicationController 
   respond_to :js, :json, :html
   before_action :set_user

   def edit
     respond_with @user
   end

   def update
      respond_to do |format|

        if @user.update user_params
          format.json {render :json => {:redirect_to => admin_manage_users_path}, :status => 200 }
        else
          format.json { render :json => {:errMsg => print_out_message('form-update','user'), :errors => @user.errors}, :status => 400 } 
        end

     end
   end

   private

   def set_user
      @user = User.find params[:id]
   end

   def user_params  
       params.require(:user).permit(:user_id, :email) #-> Ruby automatically returns the last line of a method
   end
end