Group.find结果" Coudn找不到包含''""

时间:2017-10-03 08:36:33

标签: ruby-on-rails

让我先说一下 - 我很喜欢ruby on rails,因为这里有很多用户。所以不要向我扔石头,请:) 我正在尝试在Ruby上为我的Android应用程序创建一个API应用程序。这就是我遇到的问题:

user.rb模型

class User < ApplicationRecord
  belongs_to :group
  has_many :tasks
  has_secure_password
end

这是 group.rb模型

class Group < ApplicationRecord
  has_many :users, dependent: :destroy
end

UserController.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @group = Group.find(params.require(:user).permit(:group))
    @user = User.new(user_params)
    @group.users.create(@user)
    @group.users.save
    # @user.save!
    render json: @user
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password)
  end
end

我想创建一个新用户。
我已经尝试使用@user.create(user_params)创建用户,但它说,该群组不存在,所以现在我尝试通过@group.users.create执行此操作但异常ActiveRecord::RecordNotFound in UsersController#create不停地说,它说找不到具有id={"id"=>1020};

的群组

我要展示的最后一件事是我发送的JSON:

{
  "group": {
    "id":1020
  },
  "user": {
    "name": "volkeee",
    "email": "test@gmail.com",
    "password": "123",
    "repeat_password": "123"
  }
}

2 个答案:

答案 0 :(得分:0)

更改您的创建方法,如下所示

def create
  @group = Group.find_or_create_by(params[:group][:id]) do | group |
            group.assign_attributes(group_params)
           end
  @user = @group.users.create(user_params)

  render json: @user
end

创建隐私方法

def group_params
  params.require(:group).permit(:id, :name, :has_subgroups, :created_at, :updated_at)
end

注意:用户表应具有group_id列

答案 1 :(得分:0)

Firstly create a new private method for group params like

def group_params
  params.require(:group).permit(:id)
end

replace

@group = Group.find(params.require(:user).permit(:group))

with

@group_params = group_params
@group = Group.find(@group_params[:id])

I'm not in front of a PC so cant actually test. But this should work. Let me know if this doesn't.

A better approach

Replace

@user = User.new(user_params)
@group.users.create(@user)
@group.users.save

with

@user = @group.users.new(user_params)
@user.save

This is a much cleaner and rails way