render :main, :locals => {:sender => 'sender'}
рендерим на вью с именем main которая относиться к нашему контроллеру, передаем переменню, в вью вызываем ее по имени без использовать вью из другово контроллера render
render template: "tovars/index", :locals => {:sender => 'sender'}
можно передавать заголовки, была ошибка в консоле, пока не разобрался как например сделать что бы страница выдала 404, или ее нужно самому написать и на нее рендернуться? в консоле будет заголовок с нужным статусом
head :not_found
head :bad_request
render :status => 404
Партиалы
<%= render "shared/footer" %>
партиал будет _footer, и да партиал рендерим во вьюхе
вот что бы что то туда передать
<%= render partial: "tovars/footer", :locals => {:sender2 => "тестовые данные в партиале" } %>
на досуге поищи информацию про макеты во вью, не использовал и что такое не заню
макеты
Для демонстрации работы вставить код в routes.rb и вызвать несуществующий адрес, приложение падает в ошибку, выводя таблицу роутов, еще можно "rails routes" в консоле.
resources объявляет маршруты для всех всех экшенов(index, show, new, edit, create, update, destroy)
ограничить количество маршрутов, не для всех экшенов, можно
resources :myroute , only: %i[index] do
resources :mytest, only: %i[create]
end
Добавить маршрут к коллекции
resources :photos do
collection do
get 'search'
end
end
Пространство имен
если привести пример из жизни маршруты для кода в директории admin
namespace :admin do
resources :articles, :comments
end
если в url нам не нужен админ, но в адресе к контроллеру мы его оставляем то
resources :articles,:comments, module: 'admin'
и на оборот, в url admin/articles а контроллер articles
scope '/admin' do
resources :articles, :comments
end
Вырезает заданное вторым аргументом число символов слева из строки, являющейся первым аргументом. а вообще не могли открыть гиганский фалик в екселе, файлик был с csv. загрузили его в базу, одно текстовое поле в котором данные как бы и нужны но не в полном объеме обрезали, и выгрузили в ексель
UPDATE test
SET pole = left(pole, 50)
а еще нехер выпендриваться, залез покататься на лошадку, думаю такой крутой и но но, а она понесла, охерел:) это я к чему? риск должен быть оправдан? :)
Decorator ...
Нужно сделать из большой таблички выборку. и через ActiveRecord получилось дольше, будем тут разбирать.
1) как сгенерить табличку с рандомными данными
2) запрос sql
3) варианты через ActiveRecord
4) что по оптимизации и кешированию в ActiveRecord?
Статья будет дополняться, по мере разбора новых связей.
и прям очередной мой стыд, чем отличается has_one от belongs_to а тем что в первом случае id со связью не в нашей таблице, а во второй id со связью в нашей.
милочка а вы знали что яйца чернеют от серебра?
век живи, век учись сказал поручик ржевский и предложил серебренный портсигар из кармана штанов в мундир.
создадим все по юзеру, у него будет связь один ко многим с заказами и один к одному с адресами.
!!! основное что нужно запомнить в таблицах с которыми мы создаем связь поле для связи через id должно называться имени таблицы с которой связываем подчеркивание id
bin/rails generate scaffold user login:string pass:string email:string balans:integer
bin/rails generate scaffold adr adres:string user_id:integer
bin/rails generate scaffold zakaz user_id:integer tovar:string
class User < ApplicationRecord
has_many :zakaz
has_one :adr
# has_many :adr # второй вариант смотри ниже
end
class Zakaz < ApplicationRecord
belongs_to :user
end
class Adr < ApplicationRecord
belongs_to :user
end
связь один ко многим юзера с товаром
u=User.create(login:"test1", pass: "1234", email:"testmail.ru", balans:101)
Zakaz.create(user_id: 1, tovar: "milk")
Zakaz.create(user_id: 1, tovar: "car")
Zakaz.create(user_id: 1, tovar: "beer")
User.find_by_id(1).zakaz.map{|x| p x.tovar }
связь один ко ко дному юзера с адресом, однонаправленная
Адрес знает о одном своем юзере, но абратное не верно, если уже совсем просто в модели юзера нет никаих упоминаней об адресе, вот и ничего и не знаем(ниже мы все закаментили)
class User < ApplicationRecord
has_many :zakaz
#has_one :adr
#has_many :adr
end
Adr.find_by_id(2).user.login
User.find_by_id(2).adr.adres #undefined method `adr' for #
связь один ко ко дному юзера с адресом, в обе стороны
class User < ApplicationRecord
has_many :zakaz
has_one :adr
#has_many :adr
end
User.find_by_id(2).adr.adres # уже работает, но если адресов у юзера несколько будет выбран первый
связь один ко ко дному юзера с адресом, один ко многим
class User < ApplicationRecord
has_many :zakaz
#has_one :adr
has_many :adr
end
User.find_by_id(1).adr.map{|x| p x.adres }
# и тоже самое двумя способами, надо подробнее разобрать на досуге
User.find_by_id(1).adr.collect(&:adres)
User.find_by_id(1).adr.map(&:adres)
class_exec выполнит блок для класса, class_eval строчку кода
%q{attr_reader(*attrs)}
subclass.class_eval str
instance_exec тоже для экземпляра класса принимает блок который может содержать аргумент, instance_eval содержит строку или блок но без аргумента.
в консольке пишем ruby demo.rb где:
demo.rb
require_relative 'base'
require_relative 'class1'
require_relative 'class2'
class1=MyClassOne.new
class2=MyClassTwo.new
puts class1.public_methods false
puts '='*20
puts class2.public_methods false
base.rb
class Base
require 'json'
class << self
def inherited(subclass)
attrs = attributes_for subclass
subclass.class_exec do
attr_reader(*attrs)
end
end
#super
private
def attributes_for(klass)
@methods = JSON(File.read('./data.json'))
@methods[klass.to_s.downcase]
end
end
end
class1.rb
class MyClassOne < Base
end
class2.rb
class MyClassTwo < Base
end
data.json
{
"myclassone": [
"method1",
"method2",
"method3",
"method4",
"method5",
"method6",
"method7",
"method8"
],
"myclasstwo": [
"method11",
"method12",
"method13",
"method14",
"method15",
"method16",
"method17",
"method18"
]
}
module MyModuleOne
def my_method
puts "self.class.name= #{self.class.name}, MyModuleOne my_method"
end
end
class Main
def my_method
puts "self.class.name= #{self.class.name}, Main my_method"
end
def my_method2
puts "my_method2"
end
end
class Worker < Main
prepend MyModuleOne
#include MyModuleOne
def my_method
puts "self.class.name= #{self.class.name}, Worker my_method"
super
end
end
car = Worker.new
car.my_method
puts Worker.ancestors # вывести цепочку наследования
prepend MyModuleOne подключенный метод будет иметь высший приоритет при наследовании
include MyModuleOne подключаемый метод имеет приоритет меньше метода который вызываем на экземпляре
super вызовет родительский метод если он есть. честно пока не понял где может такое пригодиться.
ancestors посмотреть цепочку и порядок наследования класса, не экземпляра а именно класса.
class MyHash < Hash
def method_missing(method, *args, &block)
puts "method_missing method = #{method}"
return store_attribute(method, *args) if method.end_with?('=')
return self[method] if self.has_key?(method)
super
end
def respond_to_missing?(method,include_private = false)
self.has_key?(method) || method.end_with?('=') || super
end
private
def store_attribute(method, *args)
key=method.to_s.delete_suffix('=')
self[key.to_sym] = args[0]
p "для экземпляра класса =#{self.class} создаем хеш с key=#{key} значение = #{args[0]}"
end
end
s = MyHash.new
s.mytestmethod = "test data for me"
puts s.mytestmethod
s.mytest = 100
puts s.mytest
puts s.inspect
puts s.respond_to?(:mytest)
puts s.respond_to?(:mytest=)
на сервере запущены несколько докер контейнеров, поним что нам нужен тот у которого в имени "сайт"
docker ps | grep name_your_container_chto_to_pro_syte
берешь его id, если нужно запустить в нем консоль руби:
docker exec -it 39126927e01e bin/rails c
если нужно зайти и что то сделать в нем
docker exec -it 39126927e01e /bin/sh
из докер контейнера копируем файл на хост
docker cp 39126927e01e:/tmp/myfile.csv /home/mydir
и на свой локальный хост если есть доступ по ssh можно скачать файл в корень своего компа
scp myname(тут собака типа @ )app.myhost.ru:/home/mydir/myfile.csv ./
как правило в докер контейнере ограниченный набор команд, поэтому запоминаем