带有ActiveModel和Forms的Rails中缺少有效载荷并且不准确

问题描述 投票:0回答:1

我有一个Organisation的模型,例如

class Organisation
  include ActiveModel::Model

  attr_accessor :orguid,
                :title, :firstname, :lastname, :role, :telephone, :extension, :email,
                :name, :branch, :address1, :address2, :address3, :city, :state, :country, :zip

end

在我的控制器中,我执行以下操作:

# frozen_string_literal: true

require 'cgi'
require 'json'

class OrganisationsController < ApplicationController
  include Secured

  before_action :set_api, only: %i[dashboard create]
  before_action :user_info, only: %i[dashboard register]

  def dashboard
    @registration = @api.registered?
  end

  def register
    @organisation = Organisation.new
  end

  def create
    organisation_params
    register_data = params[:organisation].to_h
    register_data['oruid'] = org_uid
    @api.register(register_data)
  end

  private

  def set_api
    @api = CoreApi.new(org_uid)
  end

  def user_info
    @user_info = session[:userinfo].to_h
  end

  def org_uid
    CGI.escape(user_info['uid'])
  end

  def organisation_params
    params.require(:organisation).permit!
  end

end

在我的register.html.erb中,我有:

<h1> Register Your Organisation</h1>


<%= form_with model: @organisation, url: org_register_path do |f| %>
  <div class="container">
    <h2>Your Details</h2>
    <div class="form-row">
      <div class="form-group col-md-2">
        <%= f.label :title %>
        <%= f.text_field :title, class: 'form-control' %>
      </div>
      <div class="form-group col-md-5">
        <%= f.label :first_name %>
        <%= f.text_field :firstname, class: 'form-control' %>
      </div>
      <div class="form-group col-md-5">
        <%= f.label :last_name %>
        <%= f.text_field :lastname, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-12">
        <%= f.label :role %>
        <%= f.text_field :role, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-4">
        <%= f.label :telephone %>
        <%= f.telephone_field :telephone, class: 'form-control' %>
      </div>
      <div class="form-group col-md-2">
        <%= f.label :extension %>
        <%= f.text_field :extension, class: 'form-control' %>
      </div>
      <div class="form-group col-md-6">
        <%= f.label :email %>
        <%= f.email_field :email, class: 'form-control', readonly:'', value: @user_info['info']['name'] %>
      </div>
    </div>
  </div>

  <div class="container">
    <h2>Organisation Details</h2>
    <div class="form-row">
      <div class="form-group col-md-6">
        <%= f.label :name %>
        <%= f.text_field :name, class: 'form-control' %>
      </div>
      <div class="form-group col-md-6">
        <%= f.label :branch %>
        <%= f.text_field :branch, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-12">
        <%= f.label :address_line_1 %>
        <%= f.text_field :address1, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-12">
        <%= f.label :address_line_2 %>
        <%= f.text_field :address2, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-12">
        <%= f.label :address_line_3 %>
        <%= f.text_field :address3, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-4">
        <%= f.label :city %>
        <%= f.text_field :city, class: 'form-control' %>
      </div>
      <div class="form-group col-md-4">
        <%= f.label :state %>
        <%= f.text_field :state, class: 'form-control' %>
      </div>
      <div class="form-group col-md-4">
        <%= f.label :country %>
        <%= f.text_field :country, class: 'form-control' %>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-2">
        <%= f.label :zip %>
        <%= f.text_field :zip, class: 'form-control' %>
      </div>
    </div>
  </div>

  <div class="container">
    <div class="form-row">
      <div class="form-group col-md-12">
        <%= f.button :Register, class: 'btn btn-primary' %>
      </div>
    </div>
  </div>
<% end %>

最后是我的register中的core_api.rb方法是这个:

  def register(data)
    body = data.to_json
    puts ">> >> >> >> #{body.class} :: #{body}"
    options = { headers: { 'Content-Type' => 'application/json' }, body: body }
    response = self.class.post('/organisations', options)
    #puts ">>>>>>>>>>>> #{response}"
  end

最后是我的routes.rb文件包含:

Rails.application.routes.draw do

  get '/' => 'home#show'

  get '/auth/auth0/callback' => 'auth0#callback'
  get '/auth/failure' => 'auth0#failure'

  get '/logout',                    to: 'logout#logout',                as: 'logout'

  get '/organisations/dashboard',   to: 'organisations#dashboard',      as: 'org_dashboard'
  get '/organisations/register',    to: 'organisations#register',       as: 'org_register'
  post '/organisations/register',   to: 'organisations#create'

  root 'home#show'
end

现在,当我运行服务器并在获得的日志中提交表单时:

>> >> >> >> String :: {"title":"","firstname":"","lastname":"","role":"","telephone":"","extension":"","email":"[email protected]","name":"we","branch":"we","address1":"we","address2":"","address3":"","city":"we","state":"","country":"we","zip":"","oruid":"auth0%7C5e5388493d670c11be833bca","contact_id":0}

对我来说,这看起来像是正确的json。但是,由于api响应一直不成功,因此我用Postman拦截了发出的帖子,以查看正在发送的有效负载。令我惊讶的是,有效负载不是平面json,而是这样显示的:Postman screenshot

我对此有2个问题:

  • api接受address1address2city等项目。我相信我应该发送这些,而不是当前显示的organisation[address1]organisation[address2]等。>
  • 第二个问题是,我在提交表单之后,调用/发布到api之前添加了orguid。但是,尽管我可以在日志消息中看到它,但是在邮递员有效载荷中却看不到任何形式的orguid。
  • 我在服务器上没有任何数据库。一切都通过api获取/发布/保存。一段时间以来,我一直在阅读有关如何使用Activemodel和表单的信息,但尚未设法解决。任何帮助或解释将不胜感激。

我有一个类似于组织类的组织模型,组织类包括ActiveModel :: Model attr_accessor:orguid,:title,:firstname,:lastname,:role,:telephone,:extension,:email,...

ruby-on-rails forms activemodel
1个回答
0
投票

没有冒犯,但这是火车残骸。您不必仅仅因为在这种特定情况下不使用ActiveRecord就破坏所有的惯例。

© www.soinside.com 2019 - 2024. All rights reserved.