after_validation: set_full_name в ruby ​​на рельсах - PullRequest
0 голосов
/ 07 октября 2018

Проблема:

Я создаю приложение по уходу за престарелыми.У меня есть две модели Room & Area.Я создал столбец в таблице комнат с именем full_name. После проверки я хочу сохранить полное имя. Это будет использоваться в качестве дружественного отображения метки

Я буду использовать это в резидентной форме

  <div class="col-md-4">
    <%= f.association :room, collection: @current_business.rooms.order(:name).pluck(:full_name, :id), prompt: "Choose a room"   %>
  </div>

То, что я пробовал:

Я прочитал много стековых статей.Я прочитал рубиновые документы.Я только младший разработчик, и я застрял, пожалуйста, помогите!

Я думаю, что проблема в этом разделе:

 def set_full_name
    if @room.name.changed? || @area.name_changed?
      self.full_name = [@room.name, @area.name].select(&:present?).join(' ').titleize
    end
  end

Room.rb

# == Schema Information
#
# Table name: rooms
#
#  id          :bigint(8)        not null, primary key
#  name        :string
#  created_at  :datetime         not null
#  updated_at  :datetime         not null
#  area_id     :bigint(8)
#  business_id :integer
#  author_id   :integer
#  deleted_at  :datetime
#  full_name   :string
#

class Room < ApplicationRecord
  acts_as_paranoid

  after_validation :set_full_name

  validates :name, presence: true, length: { maximum: 50 }
  belongs_to :area
  has_many :residents

  def set_full_name
    if @room.name.changed? || @area.name_changed?
      self.full_name = [@room.name, @area.name].select(&:present?).join(' ').titleize
    end
  end

end

Area.rb

# == Schema Information
#
# Table name: areas
#
#  id          :bigint(8)        not null, primary key
#  name        :string
#  created_at  :datetime         not null
#  updated_at  :datetime         not null
#  location_id :bigint(8)
#  business_id :integer
#  author_id   :integer
#  deleted_at  :datetime
#

class Area < ApplicationRecord
  acts_as_paranoid
  belongs_to :location
  belongs_to :business
  validates :name, presence: true, length: { maximum: 100 }

  has_many :rooms, -> { order(id: :asc) }, inverse_of: :area
  accepts_nested_attributes_for :rooms, reject_if: :all_blank, allow_destroy: true



end

Rooms_controller

class App::RoomsController < App::BaseController
  before_action :set_room, only: [:show, :edit, :update, :destroy]

  # GET /rooms
  # GET /rooms.json
  def index
    @rooms = current_business.rooms.order(name: :asc).paginate(:page => params[:page])
  end

  # GET /rooms/1
  # GET /rooms/1.json
  def show
  end

  # GET /rooms/new
  def new
    @room = current_business.rooms.new
  end

  # GET /rooms/1/edit
  def edit
  end

  # POST /rooms
  # POST /rooms.json
  def create
    @room = current_business.rooms.new(room_params)
    @room.author_id = current_user.id

    respond_to do |format|
      if @room.save
        format.html { redirect_to app_room_path(@room), notice: 'Room was successfully created.' }
        format.json { render :show, status: :created, location: @room }
      else
        format.html { render :new }
        format.json { render json: @room.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /rooms/1
  # PATCH/PUT /rooms/1.json
  def update
    @room.author_id = current_user.id

    respond_to do |format|
      if @room.update(room_params)
        format.html { redirect_to app_room_path(@room), notice: 'Room was successfully updated.' }
        format.json { render :show, status: :ok, location: @room }
      else
        format.html { render :edit }
        format.json { render json: @room.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /rooms/1
  # DELETE /rooms/1.json
  def destroy
    @room.destroy
    respond_to do |format|
      format.html { redirect_to app_rooms_path, notice: 'Room was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_room
      @room = current_business.rooms.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def room_params
      params.require(:room).permit(:name, :area_id, :deleted_at, :business_id, :author_id, :business_id, :author_id, :full_name)
    end
end

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Я нашел другое решение

  def set_full_name
    self.full_name = self.name
    self.full_name += ', ' + self.area.name if self.area
  end
0 голосов
/ 07 октября 2018

Почему бы просто не сделать full_name метод.Что-то вроде:

class Room < ApplicationRecord
  acts_as_paranoid

  validates :name, presence: true, length: { maximum: 50 }
  belongs_to :area
  has_many :residents

  def full_name
    "#{name} #{area.name}".titleize
  end

end

Вы уже проверяете name на Room и Area, так зачем все это .select(&:present?) и т. Д.?Просто используйте интерполяцию строк и затем titleize.

Таким образом, полное_имя всегда будет основываться на текущих значениях, и вам не нужно делать «обновление» с after_validation, бла-бла-бла,

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