×
Покер бот на Ruby on Rails (12 сен 2018)

Третья ипостась покера на ruby. Искреннее спасибо всем, кто прислал замечания по предыдущим релизам.

Идея ActiveModel. Use validations in model without any DB relations

Больше
6 мес. 4 нед. назад #1 от serge
В качестве источников и/или сопутствующих материалов укажу отличную статью Non-ActiveRecord models in Rails 4 (все без изменений для Rails 5) и обсуждение Rails validation from controller на StackOverflow.

Таким образом, за более подробным изложением - велкам по ссылкам, здесь же только код живого примера реализации Rails validation на основе ActiveModel для данных, которые не записываются в базу данных приложения.

Итак, модель:

feedback.rb
class Feedback 
    include ActiveModel::Model
    attr_accessor :name, :email, :address, :message, :suggestion
 
    # fields validation for the database.
    validates :name, presence: true
    validates :email, presence: true, length: {in:9..255}
    validates :address, presence: true
    validates :message, presence: true
    validates :suggestion, presence: true
end



feedbacks_controller.rb
class FeedbacksController < ApplicationController
def new
    @feedback = Feedback.new
end
def create
    @feedback = Feedback.new(feedback_params)
    respond_to do |format|
        if @feedback.valid?
            format.html { redirect_to success_path, notice: 'Feedback was successfully submited.' }
        else
            format.html { render :new }
        end
    end
 end
 def success
 end
private
   def feedback_params
     params.require(:feedback).permit(:name, :email, :address, :message, :suggestion)
   end
end


и вьюха:

new.html.erb
<h1>New Feedback</h1>
 
<%= form_for(@feedback) do |f| %>
 <% if @feedback.errors.any? %>
   <div id="error_explanation">
     <h2><%= pluralize(@feedback.errors.count, "error") %> prohibited this feedback from being saved:</h2>
     <ul>
     <% @feedback.errors.full_messages.each do |message| %>
       <li><%= message %></li>
     <% end %>
     </ul>
   </div>
 <% end %>
 
 <div class="field">
   <%= f.label :name %><br>
   <%= f.text_field :name %>
 </div>
 
 <div class="field">
   <%= f.label :email %><br>
   <%= f.text_field :email %>
 </div>
 
 <div class="field">
   <%= f.label :address %><br>
   <%= f.text_field :address %>
 </div>
 
 <div class="field">
   <%= f.label :message %><br>
   <%= f.text_area :message %>
 </div>
 
 <div class="field">
   <%= f.label :suggestion %><br>
   <%= f.text_area :suggestion %>
 </div>
 
 <div class="actions">
   <%= f.submit %>
 </div>
 
<% end %>
 
<%= link_to 'Back', feedbacks_path %>

Для реализации приложения оптимально для начала воспользоваться генераторами Rails, создав контроллер и модель:
# Create a Controller with only new, create & success Actions
rails generate controller feedbacks new create success --skip-routes
# Create a Model
rails generate model feedback name:string email:string address:string message:text suggestion:text

, также сконфигурировать роутер:
resources :feedbacks, :only => [:new, :create]
get 'feedbacks/success' => 'feedbacks#success', as: :success

Ну а остальное сами. :)
Для тестирования в консоли (воочию убедиться, что запись в db не производится):

Open up your Terminal, go to your project directory, and type the commands below.

rails db # to start the database client in your console.
SQLite> .tables # to list all the tables in your database (DB is selected by default).
SQLite> .headers on # to display the Column Names in your results.
SQLite> select * from feedbacks; # to see all the feedback in the database.


А я смогу! - А поглядим! - А я упрямый!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 мес. 3 нед. назад #2 от Aleksej

serge пишет: В качестве источников и/или сопутствующих материалов укажу отличную статью...


и я поступлю так же:
rusrails.ru/active-model-basics

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
6 мес. 3 нед. назад #3 от Aleksej
К одноименной статье блога.

Вариант с использованием rescue вместо elsif:
def weather
	@weather = Form.new(form_params)
    @lookup = Weather.call([params[:request]].join(","))  
	(flash[:notice] ||= []) << 'Success. ID: ' + params[:request] + '. Server response: ' + response.status.to_s
  rescue Weather::NoFoundError
    (flash[:error] ||= []) << 'Error. Invalid ID: ' + params[:request] + '. Data not received. Server response: ' + response.status.to_s
    render ...
  rescue Weather::UnvalidError
  # some crap
end
params.permit(:request) # => params.require(:request).permit(:request)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.