POST для API с рельсами формы? - PullRequest
0 голосов
/ 07 мая 2019

Я хочу создать новый продукт для API shopify.

когда я добавлю это в свой контроллер:

new_product = ShopifyAPI::Product.new
new_product.title = "Burton Custom Freestlye 151"
new_product.product_type = "Snowboard"
new_product.vendor = "Burton"
new_product.save

Он будет создавать новый продукт при каждой перезагрузке страницы

Я хочу создать продукт с формой, которую необходимо заполнить в интерфейсе.

Я пробовал это: контроллер:

@new_product = ShopifyAPI::Product.new(
      :title => :title,
      :vendor => :vendor,
      :product_type => :product_type,
    )

Просмотр:

<form method="POST" action=<%= @new_product  %> data-shopify-app-submit="">
  <input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden">
  <p>
    <label>Name:</label>
    <input type="text" name="title"/>
  </p>
  <p>
    <label>Body</label>
    <input type="text" name="body_html"/>
  </p>
  <p>
    <label>Vendor:</label>
    <input type="text" name="vendor"/>
  </p>
  <p>
    <label>Product Type:</label>
    <input type="text" name="product_type"/>
  </p>
  <p>
    <label>Tags:</label>
    <input type="text" name="tags"/>
  </p>
  <input type="submit">
</form>

Ошибка:

ActionController::RoutingError (No route matches [POST] "/"):

Затем я попытался добавить post '/' к моим маршрутам, но он не зафиксировал.

Я также добавил post 'admin/api/products' к своим маршрутам, но без помощи.

Маршрут API для POST к https://#{@shop_session.url}/admin/api/products.json, поэтому я попытался использовать эту форму:

<form method="POST" action="<%= "https://#{@shop_session.url}/admin/api/products.json" %>" data-shopify-app-submit="">
  <input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden">
....
.....
  <input type="submit">

</form>

С этим ничего не происходит.Даже не обновление в логах героку.Но в Firefox я получаю «Заблокирован политикой безопасности содержимого».

Как я могу преобразовать рабочий код в контроллере, который работает для перезагрузок, в форму, которую я могу использовать на внешнем интерфейсе?

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Когда вы пишете @new_product в вашем контроллере, скорее всего, не будет возвращено никакого значения, поэтому, когда вы обращаетесь к нему в действии формы, по умолчанию оно равно "/".

Я бы предложил создать маршрут для вашего контроллера и действия в вашем файле routes.rb. Например, если ваш контроллер - ProductsController, а действие (или метод) - def create, маршрут будет выглядеть как POST /products => products#create.

Затем в своей форме вы можете использовать /products в своем действии формы, например: <form method="POST" action="/products" data-shopify-app-submit="">

0 голосов
/ 07 мая 2019

Вы должны определить "front-end". Что это значит? В вашем приложении все ваши маршруты связаны с самим приложением, которое, мы надеемся, встроено в сам магазин. Когда у вас есть форма для добавления продукта в ваше приложение, вы отправляете POST на любую конечную точку, которую вы настроили в схеме контроллера для этого. Так что ваш интерфейс - это просто представление в вашем приложении.

Если вместо "front-end" вы имеете в виду клиента, обращенного к самому магазину Shopify, то это никогда не будет работать безопасно, за исключением случая использования шаблона App Proxy по очевидным причинам.

...