如何通过Unity(C#)使用Ruby on Rails用户控制器来注册新用户?

met*_*key 7 c# ruby-on-rails unity-game-engine

我有一个使用hartl教程创建的用户控制器,通过电子邮件和密码输入通过表单注册新用户.这工作正常.我正在尝试从Unity编辑器播放器向我的服务器发送HttpWebRequest,以便从Unity中创建的密码字符串中注册新用户.我已经提供了错误响应和与下面的尝试相关的代码.

WebException:远程服务器返回错误:(422)Unprocessable Entity.System.Net.HttpWebRequest.EndGetResponse(System.IAsyncResult asyncResult)(在> <4b9f316768174388be8ae5baf2e6cc02>:0)System.Net.HttpWebRequest.GetResponse()(在<4b9f316768174388be8ae5baf2e6cc02>:0)UnityStandardAssets.Characters.RigidbodyFirstPersonController.RigidbodyFirstPer> sonController.resetScene3 ()(at> Assets/Scripts/RigidbodyFirstPersonController.cs:463)

来自RigidbodyFirstPer的HttpWebRequest代码> sonController.resetScene3():

public static string _url = "https://immense-castle-53592.herokuapp.com/signup";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(_url);
    request.Method = "POST";
    request.Headers ["action"] = "/users";
    request.Headers ["class"] = "new_user";
    request.Headers ["id"] = "new_user";
    request.Headers ["utf8"] = "&#x2713;";
    request.Headers ["authenticity_token"] = "NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo=";
    request.Headers ["user_email"] = "jakebrantley44@gmail.com";
    request.Headers ["user_password"] = passwordUnity;

        using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            Debug.Log("Publish Response: " + (int)response.StatusCode + ", " + response.StatusDescription);
            if((int)response.StatusCode == 200)
            {
                //SetEnvironmentVersion(version);
            }
        }    
Run Code Online (Sandbox Code Playgroud)

Ruby on Rails用户控制器

class UsersController < ApplicationController

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

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    puts params[:password]
    if @user.save
      log_in @user
      flash[:success] = "Welcome to your vault!"
      redirect_to @user
    else
      render 'new'
    end
  end

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

  private

    def user_params
      params.require(:user).permit(:email, :password)
    end
end
Run Code Online (Sandbox Code Playgroud)

的routes.rb

    Rails.application.routes.draw do
  get 'sessions/new'

  root 'static_pages#home'
  get  '/help',    to: 'static_pages#help'
  get  '/demo',    to: 'static_pages#demo'
  get  '/about',   to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'
  get  '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  post '/signup', to: 'users#create'
  post '/', to: 'users#create'
  get '/show', to: 'users#create'
  delete '/logout',  to: 'sessions#destroy'

  resources :users
end
Run Code Online (Sandbox Code Playgroud) 更新:尝试使用Stream的新代码.
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(_url);

    // Set the ContentType property of the WebRequest.
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";

    // Add dictionary strings
    headers["action"] = "/users";
    headers["class"] = "new_user";
    headers["id"] = "new_user";
    headers["utf8"] = "&#x2713;";
    headers["authenticity_token"] = "NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo=";
    headers["user_email"] = "jakebrantley44@gmail.com";
    headers["user_password"] = passwordUnity;

    byte[] headersByte = UnityWebRequest.SerializeSimpleForm(headers);
    // Set the ContentLength property of the WebRequest.
    request.ContentLength = headersByte.Length;
    Debug.Log( headersByte );
    // Get the request stream.
    Stream dataStream = request.GetRequestStream ();
    // Write the data to the request stream.
    dataStream.Write (headersByte, 0, headersByte.Length);
    // Close the Stream object.
    dataStream.Close ();
        // Get the response.
        using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            // Display the status.
            Console.WriteLine (((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream ();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader (dataStream);
            //Read the content
            string responseFromServer = reader.ReadToEnd ();
            // Display the content.
            Console.WriteLine (responseFromServer);
            Debug.Log(responseFromServer);
            reader.Close ();
            dataStream.Close ();
            response.Close ();
            Debug.Log("Publish Response: " + (int)response.StatusCode + ", " + response.StatusDescription);

            if((int)response.StatusCode == 200)
            {

            }
        }
Run Code Online (Sandbox Code Playgroud)

met*_*key 0

解决了!

  1. 将发布方法从 更改Http.Web.RequestUnityWebRequestHttp.Web.Request标头不适用于传递参数。
  2. 将 Ruby/Rails users_controller.rb user_params函数更改为以下内容。控制器需要设置.fetch参数值:
def user_params
    puts "user_params runs"
    unless params["user"].blank?
        puts "main state user_params"
        params.fetch(:user, {:email => params[:EMAIL], :password => params[:PASSWORD]}).permit(:email, :password)
    end
    puts "unless state in user_params"
    params.fetch(:user, {"email"=>params[:EMAIL], "password"=>params[:PASSWORD]}).permit(:email, :password)
end
Run Code Online (Sandbox Code Playgroud)