Параметр отсутствует или значение пусто - проверки отправляются в запросе - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть модель под названием Wish:

class Wish < ApplicationRecord
  belongs_to :user
  has_one :global_product

  validates :global_product_id, presence: true
  validates :user_id, presence: true
end

Вот маршруты пожеланий:

            user_wishes GET    /users/:user_id/wishes(.:format)                                wishes#index
                        POST   /users/:user_id/wishes(.:format)                                wishes#create
          new_user_wish GET    /users/:user_id/wishes/new(.:format)                            wishes#new
         edit_user_wish GET    /users/:user_id/wishes/:id/edit(.:format)                       wishes#edit
              user_wish GET    /users/:user_id/wishes/:id(.:format)                            wishes#show
                        PATCH  /users/:user_id/wishes/:id(.:format)                            wishes#update
                        PUT    /users/:user_id/wishes/:id(.:format)                            wishes#update
                        DELETE /users/:user_id/wishes/:id(.:format)                            wishes#destroy

Как только пользователь создает global_product, они направляются на его страницу показа. Оттуда я создал кнопку, чтобы создать желание. Global_product_id - это внешний ключ в таблице Wish, поэтому они создают желание из global_product.

Исходя из маршрута, я думал, что обязательные параметры: user_id и global_product_id:

<%= link_to 'Add this product to my wish list', user_wishes_path(:global_product_id => @global_product.id,
                                                                 :user_id => current_user.id),
                                                                 :method=> :post,
                                                                 class: "btn btn-default" %>

В контроллере желаний есть метод create и wish_params:

  def create
    @wish = Wish.new(wish_params)
    @wish.save
    if @wish.save
      redirect_to 'index'
    else
      render 'new'
    end
  end

  def wish_params
    params.require(:wish).permit(:global_product_id, :user_id)
  end

Вот точная ошибка в моем последнем запросе:

Parameters: {"authenticity_token"=>"y1vzGG5+CoyGS4XAFJ6sQPlD5XyNRfSMA14r4lWsUh3N1FA8Uz/Q7HNUMWOpsPQyBILgpjVxJCM552757yNsjw==", "global_product_id"=>"25", "user_id"=>"1"}
Completed 400 Bad Request in 1ms (ActiveRecord: 0.0ms)

Я не уверен, что не так с этим запросом, так как в консоли rails я могу создать новое желание, используя Wish.create (user_id: 1, global_product_id: 25). Я пытался передать в мой запрос link_to желания и global_product, но с той же ошибкой, и, похоже, они мне не нужны. Все, что требуется, это user_id и global_product_id, которые находятся в неудачном запросе.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы отправляете свои параметры как:

{"global_product_id"=>"25", "user_id"=>"1"}

Пока ваш код:

params.require(:wish).permit(:user_id, :global_product_id)

ожидает, что это будет:

{"wish" => {"global_product_id"=>"25", "user_id"=>"1"}}

Таким образом, вам нужно исправить либо ваш wish_params метод, либо ваш link_to вызов для соответствия.

Вы можете исправить link_to так:

<%= link_to 'Add this product to my wish list', 
             user_wishes_path(user_id: current_user.id, 
                              wish: {
                                global_product_id: @global_product.id,
                                user_id: current_user.id
                              }),
             method: :post,
             class: "btn btn-default" %>
...