
Alex
20.08.2017
18:54:42
во первых class Air < ActiveRecord::Base
попрубуй так объявить
Чтобы загрузить структуру таблиц в базу используй rake db:schema:load

Google

Alex
20.08.2017
18:59:03
внутренности класса можешь оставить пустые или прописать туда валидации
вызывать будешь Air.new() или Air.create() и () передавать параметры (header: 'text' или header: "#{var}")
получилось?

Denis
20.08.2017
19:14:44
вот так?
class Air < ActiveRecord::Base.establish_connect
create_table :air do |table|
table.column :header, :string
table.column :price, :string
table.column :body, :text
table.column :link, :string
end
end
а это я гоню
вот подключение
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => 'air.db'
)
там твой естаблиш конн
а вот как модель правильно описать вопрос. а не подключение.
раз наезд идет на первую строку описания модели именно.

Alex
20.08.2017
19:28:28
require 'active_record'
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: 'air.db'
)
ActiveRecord::Schema.define do
create_table :air do |table|
table.column :header, :string
table.column :price, :string
table.column :body, :text
table.column :link, :string
end
end
class Air < ActiveRecord::Base
end
вот это просто скопируй вместо всего своего

Google

Alex
20.08.2017
19:28:45
и скопируй какая будет ошибка
rake db:schema:load
@ro31337 , вот это совсем не понятно:
Так вот, в этом своем собственном Ability я бы сделал проверку - отвечает ли модель на policy, например так: @resource.respond_to?(:policy). Если да - то просто вызвать этот метод, а этот метод должен возвращать уже свою Policy - просто экземпляр класса, который решает кому давать доступ, а кому нет. Для blog'а это будет BlogPolicy, для коммента CommentPolicy и т.д. - эти policy будут просто делать head 403 если что-то не авторизовано.
Как будет минутка можешь как-то перефразировать или пример какой-нибудь привести?
Метод действительно красивый, хочется в нем разобраться
Ну тоесть есть метод:
def current_ability
@current_ability ||= Ability.new(current_user)
end

Ro
20.08.2017
20:00:13
док курил https://github.com/ryanb/cancan/wiki/changing-defaults ? если да, буду рассказывать дальше

Alex
20.08.2017
20:02:17
Да, документацию смотрел. Тут впринципе понятно, при вызове current_ability вернется экземпляр класса Ability с параметром текущего пользователя

Ro
20.08.2017
20:03:30
ну вот, когда cancan вызывает Ability (ты можешь создать свой класс), оно передает subject если не ошибаюсь в authorize!
ну и на этом этапе у тебя все есть, ты можешь делать subject.respond_to?(:policy)
subject - это твоя модель
в модели в этом методе возвращаешь экземпляр BlogPolicy, например. Ну а интерфейс policy это по сути один метод authorize! - т.е. то же самое, что и в Ability этом
только в той доке что по ссылке на гитхабе у тебя идет if request.fullpath =~ /\/locomotive/ - тогда и возвращается Locomotive::Ability
а в моем способе ты это в модели определяешь, без лишних if'ов

Nikolay
20.08.2017
20:09:47
еще ведь час флуда, посмотрите серию ситкома man seeking woman 2 сезон 5 серия, там про курсы программирования, 20 минут всего

Alex
20.08.2017
20:15:15
@ro31337, тоесть основная мысль вызвать метод из модели (не из контроллера), а из cancan, верно?
Форма находится в рамках модели Post, а валидировать я должен модели User и Blog связанные через полиморфные связи BlogUser
плюс все это закэшируется как я прочитал

Ro
20.08.2017
20:16:13
форма - хз причем тут форма
полиморфные связи тоже непонятно)
смысл - вызвать метод из модели, метод возвращает экземпляр Policy для данной модели. Таким образом модель не перегружается сильно. Policy реализует метод authorize! - там и происходит проверка прав доступа. Если нет, значит head 403 выдается например
(все с оговоркой - речь идет про rails - если это было бы не rails, то я бы делал иначе)
> основная мысль вызвать метод из модели..., а из cancan
непонятное предложение

Google

Alex
20.08.2017
20:23:33
Мы наверное забыли исходную задачу :) Я позволю себе напомнить её.
Есть модели Post, есть модель Blog, есть модель User. Blog has_many :users, Users has_many :blogs
Задача при :create методе в модели Post валидировать не подменил ли данные blog_id хацкер на произвольные ( не на те, что вернул current_user.blogs.all.collect)
В процессе решения данной задачи, было предложено использовать: load_and_authorize_resource в контроллере Posts - создает одноименные с контроллером переменные для каждого (index, show, create and etc...). Предварительно проверяя их на условия которые прописаны в Ability (def initialize(user)) в моем случае это :
elsif user.is? :member
can :create, Post
пока я все верно понял?


Ro
20.08.2017
20:59:41
ну это очень частный случай, проверить подмену - это 1 строка кода, я про общий вариант - проверить доступ к сущности. Имеет ли пользователь право совершать операции с сущностью (== с моделью).
пока сделай просто load_and_authorize_resource чтобы работало
а потом добавишь ability - самый простой, как в доке на гитхабе чуть выше указано
(далее когда поймешь как это работает - подумай про то, чтобы вынести эту логику в отдельный класс)
(связанный с моделью)

Alex
20.08.2017
21:12:29
Да, так и сделаю.
Благодарю, пойду я спать ) видимо пора передохнуть
@ro31337 , отошел на пару минут от компьютера, выпил кофе и похоже понял тебя
фактически это будет выглядеть? blog.respond_to?(:название метода в модели blog)

Ro
20.08.2017
22:32:08
вопрос непонятен, не могу ответить. blog.respond_to не будет, будет subject.respond_to - ведь задача в конце сделать так, чтобы КАЖДЫЙ ресурс возвращал policy
сначала сделай просто load, без authorize

Ro
20.08.2017
22:32:45
хоть у тебя и будет load_and_authorize_resource - без авторизации
потом прикрутишь авторизацию
когда будет загружаться, а потом сделаешь декомпозицию авторизации, уберешь ее из того места, где она у тебя будет
как это будет - сложно объяснить когда у тебя еще нет даже load ?

Denis
21.08.2017
04:55:47
Hello Guyz!
class Air < ActiveRecord::Base
create table :air do |t|
t.string :header
t.string :price
t.text :body
t.string :desclink
end
end
`method_missing': undefined method `table' for Air (call 'Air.connection' to establish a connection):Class (NoMethodError)
who can help me?

Google

Roman
21.08.2017
04:59:03
create_table

Denis
21.08.2017
05:23:49
`method_missing': undefined method `create_table' for Air (call 'Air.connection' to establish a connection):Class (NoMethodError)

Maks
21.08.2017
06:01:03

Denis
21.08.2017
06:01:28
what?

Maks
21.08.2017
06:01:38
1- define method 'create_table' somewhere in your code
or 2 - if this method is a part of some custom class - create the object of this clas

Admin
ERROR: S client not available

Xenial
21.08.2017
06:03:35
Я уже где-то видела эту задачку

Maks
21.08.2017
06:03:51
for instance, if Air is the class, you should create the object like air1 = Air.new
and then air1.create_table

Denis
21.08.2017
06:13:39
Блин Макс ну напиши по русски как оно вообще надо
киньте в меня моделью AR а то я только DM юзал до этого
если бы не злой Джейсон который сука не вытирается из системы я бы его и заюзал
кстати вопрос ? как удалить гем раз и навсегда железно 100% гарантия?
вот я поиском прошел по системе все что нашел удалил
sudo find / -name *json-2.1.0*
Password:
find: /dev/fd/air_rb: No such file or directory
find: /dev/fd/air_rb: No such file or directory
/Users/roger/.gem/specs/api.rubygems.org%443/quick/Marshal.4.8/json-2.1.0.gemspec
во!
я его удалял удалял и анинсталом и руками
а гем его показывает в списке

Google

Denis
21.08.2017
06:19:20
как так где у него кеш?

Maks
21.08.2017
06:33:08
у тебя нигде не сказано, откуда берется метод create_table и что он делает
в программе, я имею ввиду
она не в курсе, что это за create_table
и об этом и говорит

Denis
21.08.2017
06:38:04
ну да не сказано
а я че? я с документации списывал
ну тогда звездюлей тем кто писал
вот и вся песня
require 'active_record'
require 'sqlite3'
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => 'air.db'
)
class Air < ActiveRecord::Base
create_table :air do |t|
t.string :header
t.string :price
t.text :body
t.string :desclink
end
end

Maks
21.08.2017
07:06:20
всё, вспомнил, о чем речь
запихни весь 'create_table' в def change
class Air < ActiveRecord::Base
def change
create_table :air do |t|
t.string :header
t.string :price
t.text :body
t.string :desclink
end
end
end
это ж миграция
вот тут подробно: http://v32.rusrails.ru/rails-database-migrations/anatomy-of-a-migration

Denis
21.08.2017
07:14:54
ТАДАМ! ?
Ну а теперь самый гадкий и вонючий вопрос
как снести Гем но так что бы и следа не осталось? MACOS