ActionController ::ParameterMissing (параметр отсутствует или значение пустое: свойства):

#javascript #ruby-on-rails

#javascript #ruby-on-rails

Вопрос:

Я продолжаю получать это сообщение #<ActionController::ParameterMissing: параметр отсутствует или значение пустое: свойство>, и просто не знаю, как разрешить все исследования, которые я провел, и сравнил свою работу.

Я думаю, что у меня правильно настроено действие создания

 def create
        raise params.inspect    
        @property = Property.create(prop_params)
       
         
        if @property.save!
            render json: @property
        else
            render json: { error: "Couldn't save"}
        end
    end

 def prop_params
        params.require(:property).permit(:address, :state, :sale_price, :owner_id)
 end

  

Вот и моя модель для свойств.

 class Property < ApplicationRecord
    belongs_to :owner
    
end
  

Когда я повышаю param.inspect, я получаю это

 Object { status: 500, error: "Internal Server Error", exception: "#<RuntimeError: <ActionController::Parameters {"controller"=>"properties", "action"=>"create"} permitted: false>>", traces: {…} }
  

Я знаю, что он должен показывать то, что я передал, но в какой-то момент он просто перестает показывать то, что я передал, и просто начал показывать контроллер и действие.

Как мне отправить форму во внешнем интерфейсе?

 listForm.addEventListener('submit',(event) =>{
     event.preventDefault();   
     
     const property = {
       address: document.getElementById('address').value,
       state: document.getElementById('state').value,
       sale_price: document.getElementById('sale_price').value,
       owner_id: document.getElementById('owner_id').value,
     }

     const listObj = {
      method: 'POST',
      header: {
        'Content-Type': 'application/json',
          "Accept": "application/json"
      },
      body: JSON.stringify(property)
     }
      fetch(PROPERTIES_URL, listObj)
      .then(res => res.json())
      .then((list_data) => {
        let new_listing = renderListing(list_data)
        listings.append(new_listing)
        listForm.reset()
        console.log(list_data)
      })
  })
  

Как я могу устранить это препятствие из-за моей сильной проблемы с параметрами?

Ответ №1:

Ошибка, которую вы получаете, является результатом того, насколько сильные параметры работают в Rails.

 params.require(:property).permit(:address, :state, :sale_price, :owner_id)
  

Приведенная выше строка сообщает Rails, что вы хотели бы получить свои параметры в этой форме:

 {
  property: {
    address: "123 city st",
    state: "NSW",
    sale_price: 100.00,
    owner_id: 1
  }
}
  

Обратите внимание, что часть require(:property) сообщает Rails, что параметры, которые вы хотите получить, должны иметь ключ «свойство». Внутри ключа свойства вы указываете ему разрешить остальные ключи (:address, :state, :sale_price, :owner_id).

Самое простое решение исправить ваш код — просто изменить тело, которое вы отправляете из интерфейса, чтобы оно соответствовало требуемому формату, изменив эту строку:

 // Before
body: JSON.stringify(property)
// After
body: JSON.stringify({ property })
  

Вы можете прочитать больше о строгих параметрах здесь .

Комментарии:

1. К сожалению, это приложение проклято, потому что у меня это не сработало. Но это имело смысл так, как вы это объяснили. Кто-то еще намекал на то же самое в какой-то момент. Я все еще продолжаю получать сообщение