Rails 5: find_or_create_by не сохраняет все параметры - PullRequest
0 голосов
/ 11 января 2019

У меня есть форма для отправки информации. Один из входных данных - empresa_id, и он представлен коллекцией. Я проверил на сервере форму отправки информации, которую я хочу. Дело в том, что это поле (только это) не сохраняется при запуске find_or_create_by. Я проверил сильные параметры, и там все вроде нормально.

SuscriptorsController

  def create
    @suscriptor = Suscriptor.new(suscriptor_params)

    byebug #In this point @suscriptor.empresa_id has a correct value
    if !@suscriptor.valid?
      flash[:error] = "El email debe ser válido"
      render 'new'
    else
      @suscriptor = Suscriptor.find_or_create_by(email: @suscriptor.email)
      if @suscriptor.persisted?
        if (@suscriptor.email_confirmation == true)
          flash[:notice] = "Ya estás registrado/a"
          redirect_to root_path
        else
          SuscriptorMailer.registration_confirmation(@suscriptor).deliver
        end
      else
        flash[:error] = "Ha ocurrido un error. Contáctanos desde la sección contacto y explícanos"
        render 'new'
      end
    end


  private
  def suscriptor_params
    params.require(:suscriptor).permit(:email, :email_confirmation, :token_confirmation, :subtitle, :empresa_id)
  end

Форма просмотра

<%= simple_form_for(@suscriptor) do |f| %>

<div class="input-group">
  <div class="col-md-12">

    <div class="form-group text">
      <%= f.input :email, class: "form-control", placeholder: "tucorreo@email.com", required: true %>
      <%= f.invisible_captcha :subtitle %>
      <small id="emailHelp" class="form-text text-muted">Lo guardaremos y usaremos con cuidado.</small>

      <%= f.input :empresa_id, collection: Empresa.all %>
    </div>


    <div class="input-group-append">
      <%= f.submit "¡Hecho!", class: "btn btn-primary" %>
    </div>
  </div>
<% end %>

schema.rb

  create_table "suscriptors", force: :cascade do |t|
    t.string   "email"
    t.boolean  "email_confirmation"
    t.string   "token_confirmation"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.integer  "empresa_id"
  end

suscriptor.rb

class Suscriptor < ApplicationRecord
  belongs_to :empresa, optional: true

  before_create :confirmation_token
  attr_accessor :subtitle

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email, presence: true, length: { maximum: 255 }, uniqueness: { case_sensitive: false }, format: { with: VALID_EMAIL_REGEX }

  def confirmation_token
      if self.token_confirmation.blank?
          self.token_confirmation = SecureRandom.urlsafe_base64.to_s
      end
  end

end

1 Ответ

0 голосов
/ 11 января 2019

В вашем find_or_create_by вы передаете только @suscriptor.email и пересылаете переменную @suscriptor с созданным suscriptor.

В соответствии с док-станцией API вы должны передать блок для «создания с большим количеством параметров»:

Suscriptor.find_or_create_by(email: @suscriptor.email) do |suscriptor|
  suscriptor.empresa_id = @suscriptor.empresa_id
end

Будьте внимательны, чтобы не переназначить @suscriptor переменную , прежде чем будет использовать параметры.

Вы можете узнать больше о find_or_create_by в https://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...