未定义的{…}方法“model_name”

fgw7neuy  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(291)

我有一个设置表单,在传递数据和保存数据时遇到了一些问题。
我有以下代码
路线

get 'settings', to: 'settings#index'
put 'settings', to: 'settings#update_all'

控制器

def index
end

def update_all
  params[:setting].keys.each do |index, value|
    setting = Setting.find_by(name: index)

    if setting
      setting.value = value
      setting.save
    end
  end
end

private

def setting_params
  params.permit(
    # company details
    :company_name,
    :company_system_display_name,
    :company_address_1,
    :company_address_2,
    :company_address_3,
    :company_address_4,
    :company_postcode,
    :company_default_country_id,
    :company_web_site,
    :company_main_contact,
    :company_main_telephone,
    :company_main_fax,
    :company_main_mail,
    :company_accounts_contact,
    :company_accounts_telephone,
    :company_accounts_fax,
    :company_accounts_mail,
    :delivery_contact_name,
    :setting_delivery_address_1,
    :setting_delivery_address_2,
    :setting_delivery_address_3,
    :setting_delivery_address_4,
    :delivery_postcode,
    :delivery_country_id,

    # tax payroll
    :company_incorporation_status,
    :company_registration_number,
    :number_of_partners,
    :is_vso,
    :company_corporation_tax_number,
    :is_efpm,
    :company_year_end,
    :company_year_end,
    :paye_sender_id,
    :paye_pass,
    :paye_eoy_mail,
    :company_vat_status,
    :company_vat_number,
    :cash_accounting,
    :cash_accounting,
    :vat_adjustment_limit,
    :btp_enabled,
    :btp_api_url,
    :btp_realm,
    :btp_client_id,
    :btp_client_secret,
    :eori_number,
    "Personal Travel",
    "Personal Motoring",
    "Personal Telephone",
    :company_paye_tax_number,
    :rti_start_date,
    :payroll_bacs_sort_code,
    :paye_accounts_office_reference_number,
    :econ,
    :week_end_day,
    :weekly_pay_day,
    :payroll_first_two_week_pay_date,
    :payroll_first_four_week_pay_date,
    :standard_sp_recovery_rate,
    :nic_compensation,
    :hmrc_employers_nic_allowance,

    # system settings
    :bcc_address,
    :check_stock_levels,
    :default_purchase_invoice_price_type,
    :discounts_enabled,
    :enable_custom_documents,
    :doc_layout,
    :nav_type,
    :valid_for,
    :quote_value,
    :default_true_create_supply_orders,
    "exclude_non-manufactured_from_wo_creation_from_so",
    :remove_works_order_from_plan_after_edit,
    :include_sales_order_notes_on_picking_lists,
    :user_change_own_password,
    :auto_populate_receive_invoice,
    :assume_supplier_has_vat_number_for_auto_populate_receive_invoice,
    :backorder_default,
    :consolidate_work_order,
    :over_delivery_default,
    :use_package_lines,
    :hightlight_below_order_quantity_on_grn,
    :show_poi_descriptions_on_order_lines,
    # VAT RATES
    :default_stock_item_vat_rate_id,
    :margin_markup,
    :restrict_purchase_invoice_query_flag,
    :update_probability_on_opportunity_status_change,
    :default_stock_item_vat_rate_id,
    :enable_comments_on_stock_components,
    :no_supplier_serial_numbers,
    :enable_batch_number_generation,
    :intrastat_enable,
    :intrastat_enable_tod,
    :wo_process_start_time,
    :negative_current_stock,
    "default_customer_payment_term_id",
    "default_supplier_payment_term_id",
    :min_supplier_payment,
    :show_vat_on_uninvoiced_sales,
    :hide_due_date_on_sales_quotes_and_orders,
    :hide_due_date_on_purchase_quotes_and_orders,
    :inherit_default_sales_accounts,
    :logo_position,
    :company_logo,
    :company_logo_image_file,
    :company_logo_image_file,
    :kpi_plan_vat_rate,
    :kpi_plan_payroll_rate,
    :kpi_use_average_cos,
    :kpi_use_average_labour,
    :sales_order_item_custom_info_1_form_name,
    :sales_order_item_custom_info_1_enabled,

    # trade terms
    :terms_of_trade,

    # factoring
    :factor_type,
    :factor_user,
    :factor_pass,
    :factoring_image_file,
    :default_repair_order_stock_item_id,
    :default_repair_stock_location_id,
    :default_repair_labour_stock_item_id,

    # document storage
    :document_storage_type,
    :dropbox_access_token,

    # web api
    :api_url,
    :api_key,
    :api_enabled
  )
end

指数

<% content_for :title, "Edit Setting" %>

<div class="l-12col">
    <h1>Edit Settings</h1>
</div>

<%= render partial: "form", locals: { setting: @setting, submit_text: "Update" } %>

形式

<div class="l-12col" id="settings_form">
  <%= form_with model: setting, url: settings_path, method: :put, multipart: true do |f| %>
    <div class="tabs">
      <!-- start tab headings -->
      <div class="tab-headings">
        <a class="tab-button active" data-id="company_details">Company Details</a>
        <a class="tab-button" data-id="tax_payroll">Tax &amp; Payroll</a>
        <a class="tab-button" data-id="system_settings">System Settings</a>
        <a class="tab-button" data-id="trade_terms">Trade Terms</a>
        <a class="tab-button" data-id="factoring">Factoring</a>
        <a class="tab-button" data-id="document_storage">Document Storage</a>

        <% if Features.API? %>
          <a class="tab-button" data-id="web_api">Web API</a>
        <% end %>
      </div>
      <!-- end tab headings -->

      <div class="tab-contents">
        <!-- start of company_details tab -->
        <div class="tab-content active" id="company_details">
          <div class="l-row-block clearfix">
            <div class="l-06col l-ml-12col l-md-12col">
              <h2 class="txt-title-alt">
                Name &amp; Address

                <span data-tooltip title="Full legal name and address for this business as it should appear on business documentation.">
                  <span class="icon-help-with-circle" aria-hidden="true"></span>
                </span>
              </h2>

              <div class='field l-margin-sm'>
                <%= f.label :company_name %>
                <%= f.text_field :company_name %>
              </div>

              <div class='field l-margin-sm checkbox_form'>
                <%= f.check_box :company_incorporation_status %>
                <%= f.label :company_incorporation_status, "Incorporated?" %>
              </div>
            </div>
          </div>
        </div>
        <!-- end of company_details tab -->
      </div>
    </div>

    <div class="btns">
      <%= submit_tag submit_text, id: 'company_settings_update_btn' %>
      <%= link_to "Cancel", root_path, class: "btn-medium" %>
    </div>
  <% end %>
</div>

数据库结构

错误:

NoMethodError at /settings
undefined method `model_name' for {"quote_format"=>"QU-%5n", "quote_value"=>1, "company_name"=>"Your Business Name", "company_address_1"=>"Address Line 1", "company_address_2"=>"Address Line 2", "company_address_3"=>"Address Line 3", "company_address_4"=>"Address Line 4", "company_postcode"=>"Postcode", "company_main_contact"=>"Your Name", "company_main_telephone"=>"Your Telephone Number", "company_main_fax"=>"Your Fax Number", "company_main_mail"=>"Your e-Mail", "company_accounts_contact"=>"", "company_accounts_telephone"=>"", "company_accounts_fax"=>"", "company_accounts_mail"=>"", "company_web_site"=>"Your Web Site", "company_incorporation_status"=>true, "company_registration_number"=>"", "company_corporation_tax_number"=>"", "company_paye_tax_number"=>"",

这是一个遗留应用程序,我刚刚重新构建了表单,并试图让它再次工作。db结构很奇怪,就我个人而言,我会正确地使用activerecord::store来实现这一点,但由于我们无法更改db中的任何内容,这是不可能的。
如果有人有什么想法那就太好了。
编辑:经过上述更改后,我现在有以下内容

NoMethodError at /settings
undefined method `keys' for nil:NilClass

Hint: Something is `nil` when it probably shouldn't be.

编辑2:运行时 rails c 我得到以下信息

Running via Spring preloader in process 5793
Loading development environment (Rails 6.1.3.2)
[1] pry(main)> @settings
=> nil
[2] pry(main)> @setting
=> nil
[3] pry(main)> Setting.all
  Setting Load (0.4ms)  SELECT `settings`.* FROM `settings`
=> [#<Setting:0x000056318efee410
  id: 1,
  name: "quote_format",
  value: "QU-%5n",
  value_type: "string",
  created_at: Tue, 13 Jul 2021 20:49:16.000000000 BST +01:00,
  updated_at: Tue, 13 Jul 2021 20:49:16.000000000 BST +01:00,
  created_by: nil,
  updated_by: nil>,
 #<Setting:0x000056318f1b2df0
  id: 2,
  name: "quote_value",
  value: "1",
  value_type: "integer",
  created_at: Tue, 13 Jul 2021 20:49:16.000000000 BST +01:00,
  updated_at: Tue, 13 Jul 2021 20:49:16.000000000 BST +01:00,
  created_by: nil,
  updated_by: nil>,
 #<Setting:0x000056318f1b2c10
  id: 3,
....
k75qkfdt

k75qkfdt1#

在玩了几天的代码之后,以下是有效的方法。
形式

<%= form_with(model: setting, scope: :settings, method: :post, multipart: true) do |f| %>

控制器

def index
  settings = {}

  Setting.all.each do |setting|
    settings[setting.name] = setting.value
  end

  @settings = OpenStruct.new(settings)
end

def update
  @errors = []
  @error_list = []

  params[:settings].each do |name, value|
    setting = Setting.find_by(name: name)
    next unless setting.present?

    setting.update(value: value)
  end

  redirect_to settings_path, notice: 'Settings have been updated'
end

现在,让错误和其他字段正常工作。

相关问题