@rubyschool

Страница 310 из 921
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)

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

Страница 310 из 921