LINUX.ORG.RU

Вопросы про rails. Поможете? *строит красивые глазки.

 


1

1

Хотела задать вопрос по namespace'у в рельсах. Это как? Ну вот скажем мне нужно 4 namespace'. Когда генеришь контроллер например users он ж генериться в myapp/app/controllers вот, а как сделать шоб этот контроллер сгенерился в myapp/app/controllers/user. Создать директорию user и в него перетащить сгенерированный контроллер? А потом указать путь к нему в routes.rb? И как указывать путь?

И еще можно я тут буду задавать вопросы касательно рельсов?

★★

Последнее исправление: gssomi (всего исправлений: 1)

Ответ на: комментарий от anonymous

о спасибо, а пути сами указываются?

gssomi ★★
() автор топика

Это называется модули. Но вы применяете их неправильно.

ruby /path/to/script/generate controller 'testmodule/test' test
Для вас будет создан контроллер в app/controllers/testmodule/test_controller.rb вид/хелпер/etc.
Но зачем вы хотите засунуть туда отдельно user — не понятно.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

о, спасибо за подробности.

Но зачем вы хотите засунуть туда отдельно user — не понятно.

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

gssomi ★★
() автор топика
Ответ на: комментарий от gssomi

Рефакторинг такого кода заметно усложнится. Скорее всего они или вы перепутали модели с модулями. Почитайте про объекты-прослойки, наподобие queryObj/formObj/etc, прочитайте зачем нужны декораторы, и пару стандартных вещей:
https://en.wikipedia.org/wiki/Strategy_pattern
https://en.wikipedia.org/wiki/Single_responsibility_principle В интернете полно информации. После этого начинайте проектировать и создавать нужную структуру, стараясь по возможности не сильно отходить от основных стандартов. Иначе вы рискуете получить монстра еще хуже чем был у вас в битрикс. Дерзайте.

znenyegvkby
()
Ответ на: комментарий от gssomi

rails g resource user/moderators

rails g resource user/admins

В целом понятно зачем нэймспейсы нужны? если тебе нужен один ресурс user, то «rails g resource user» в итоге у тебя сгенерируется все, что нужно. В общем, посмотри хотя бы Rails for Zombies или railstutorial.ru, а то ведь ничего хорошего не выйдет с таким подходом.

Nucleus-
()
Ответ на: комментарий от znenyegvkby

Почитайте про объекты-прослойки, наподобие queryObj/formObj/etc, прочитайте зачем нужны декораторы

Ага, человек не понимает как ресурсы генерировать, самое время ему почитать про объекты-прослойки и прочие паттерны. Может лучше от простого к сложному, а не наоборот?

Nucleus-
()
Ответ на: комментарий от Nucleus-

я делала с начала rails g controller Users new --no-test-framework и подошел директор. я ему объяснила так и так, такая структура. а он сказал разделить шоб у каждого был свой MVC. вот и так вот. Да в целом понятно, спасибо. я не понимаю rails for zombies, там слишком быстро говорят. а туториал я читаю.

gssomi ★★
() автор топика
Ответ на: комментарий от gssomi

Ну если ты добавишь модель user и вьюху нужную, то это и будет MVC, там директории никакие не нужны для одного ресурса. Директор может сам чего-то не понимает.

а туториал я читаю.

Отлично тогда.

Nucleus-
()
Ответ на: комментарий от Nucleus-

Ага, человек не понимает как ресурсы генерировать, самое время ему почитать про объекты-прослойки и прочие паттерны. Может лучше от простого к сложному, а не наоборот?

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

Почитайте про объекты-прослойки, наподобие queryObj/formObj/etc, прочитайте зачем нужны декораторы

в отрыве от контекста моего комментария не значит абсолютно ничего.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

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

ТС - новичок. Новичку не нужно знать о декораторах, форм обжектах и пр., потому, что он даже не в состоянии понять, чем оно хорошо и тем более это не даст никакого понимания структуры проекта. Опыта у него нет, чтоб это осознать. Возьми любой курс/туториал и подумай, почему никто даже не упоминает тех вещей, что ты перечислил.

В следующий раз, если спросят про нэймспэйсы в рельсах, можно сразу ссылку на SICP давать.

Nucleus-
()
Ответ на: комментарий от Nucleus-

В следующий раз, если спросят про нэймспэйсы в рельсах

Здесь спрашивали не о namespace. Ты разницу видишь? Здесь спутали namespace с модулями. Это раз.

можно сразу ссылку на SICP давать

Хотя бы уведомляй когда шлангуешь.

Новичку не нужно знать о декораторах, форм обжектах и пр
тем более это не даст никакого понимания структуры проекта.

это не даст никакого понимания структуры проекта

Ты понимаешь, надеюсь, что ты сам в этом ничего не понимаешь, раз делаешь такие заявления? :)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Здесь спрашивали не о namespace. Ты разницу видишь?
Хотела задать вопрос по namespace'у в рельсах.

Это был пример.

Ты понимаешь, надеюсь, что ты сам в этом ничего не понимаешь, раз делаешь такие заявления? :)

Давай, понимающий, расскажи как знание о форм/квери обжектах, декораторах, или стратегии, поможет новичку в понимании, где должен находится простейший контроллер. Или не в этом проблема была? В этом Хартл поможет, а не твои ссылки, которые все равно не будут осознанны на данном этапе.

Ты, видать, один из тех, кто будучи новичком частенько обсирался от избытка информации, а когда наконец усвоилось что-то, решил строить из себя великого архитектора и заодно вредить бесполезными советами другим новичкам. Попробуй блистать знаниями в тему, в общем.

Nucleus-
()

Поможете? *строит красивые глазки.

Time to get RAILed.

anonymous
()
Ответ на: комментарий от anonymous

Ты о чем? Я тобой даже не говорил. Из-за тебя заводить тор? Да ты мне так-то ничего и не писал. Ты еще и поплакал в некорректные сбегал, вестимо. Залогинишься, тогда и пиши, ливайщик.

znenyegvkby
()
Ответ на: комментарий от Nucleus-

Хорошо, чтобы вы не плакали в некорректных что ваши чувства оскорбляют, постараюсь ответить нормально:

Давай, понимающий, расскажи как знание о форм/квери обжектах, декораторах, или стратегии, поможет новичку в понимании, где должен находится простейший контроллер. Или не в этом проблема была? В этом Хартл поможет, а не твои ссылки, которые все равно не будут осознанны на данном этапе.

Любой obj по сути является связующим звеном между моделями и контроллерами. Один и тот же obj может использовать десятки разных моделей для одного действия. Если джуниор начинает изначально пихать всю бизнес-логику в модель не отделяя отдельный функционал особняком, то на практике — он так и будет городить толстые модели, что в случае тестирования/рефакторинга — еще хуже чем толстые контроллеры. Теперь можешь попробовать увязать это со структурой проекта.

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

Не знаю зачем ты сюда это приплел. Я говорил только о структуре проекта, и все что есть в комментарии выше, тесно с ней связано. Если ты этого не видишь — это твои личные проблемы.

Ты, видать, один из тех, кто будучи новичком частенько обсирался от избытка информации, а когда наконец усвоилось что-то, решил строить из себя великого архитектора и заодно вредить бесполезными советами другим новичкам. Попробуй блистать знаниями в тему, в общем.

Не угадал, телепат. Просто я повидал таких как ты — джуниоров, уверенных в себе и гробящих архитектуру проекта на начальной стадии. Обычно сначала они выглядят так:
https://c-a.d-cd.net/9eb0a1cs-960.jpg
Но когда проект взрослеет и расширяется, они выглядет уже вот так:
http://cs5.pikabu.ru/images/big_size_comm/2014-12_5/14192814992070.jpg

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Залогинишься, тогда и пиши

Ага, щаз. Нет уж, лучше я посру тебе на голову из-под онанимуса. Как там поживает твой скор, ебанашка?

anonymous
()
Ответ на: комментарий от anonymous

ну тогда прошу не гадить этот тред, оно мне еще пригодиться. а жаловаться, хоть вы анон не хочу.

gssomi ★★
() автор топика
Ответ на: комментарий от znenyegvkby

Чего простыню накатал, если не хотел изначально?

Если джуниор начинает изначально пихать всю бизнес-логику в модель не отделяя отдельный функционал особняком, то на практике — он так и будет городить толстые модели, что в случае тестирования/рефакторинга — еще хуже чем толстые контроллеры.

Нет не будет. До него в итоге дойдет понимание, что так делать плохо и это вызывает дальнейшую боль, и это будет усвоено через призму собственного опыта, а не потому что какой-то кукаретик ему статью об этом скинул.

Просто я повидал таких как ты — джуниоров, уверенных в себе и гробящих архитектуру проекта на начальной стадии.

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

Nucleus-
()
Ответ на: комментарий от znenyegvkby

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

Nucleus-
()
Ответ на: комментарий от Nucleus-

До него в итоге дойдет понимание, что так делать плохо и это вызывает дальнейшую боль

Угу. Если дойдет. А вообще почитай предыдущие треды gssomi, она ж выбрала рельсы для вполне конкретного проекта, там какой-то инет-магазин. Т.е. вполне конкретный заказчик должен будет платить за то, чтобы человек набивал себе опыт через попаболь?

и это будет усвоено через призму собственного опыта, а не потому что какой-то кукаретик ему статью об этом скинул.

В данной конкретной ситуации, лучше потратить больше времени и изучить больше материала, иначе когда проект уже будет слеплен на уровне «и так сойдет» — результат будет плачевным. Если есть свободное время — лучше прочти больше теории, семь раз отмерь, как говорится, а «тренируйся вон на... — кошках!» (с)

А если джуниор работает один над проектом и ему неоткуда ждать помощи, то и результат получится соответствующий, как ни крути.

Здесь именно такая ситуация, но ТСу еще есть кому подсказать. Поэтому результат можно сделать лучше, но ты предпочитаешь драматизировать. Окей.

Но тебе-то откуда знать об этом, ты, видимо, в команде из одного человека только работал.

Телепатор у тебя барахлит, вестимо.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

А вообще почитай предыдущие треды gssomi, она ж выбрала рельсы для вполне конкретного проекта, там какой-то инет-магазин.

нет, этот проект заморозили. Сейчас другой проект.

gssomi ★★
() автор топика

Вопросы про rails. Поможете? *строит красивые глазки.

Нет! *показывает средний палец.

Deleted
()
Ответ на: комментарий от znenyegvkby

Т.е. вполне конкретный заказчик должен будет платить за то, чтобы человек набивал себе опыт через попаболь?

Если заказчик выбирает для разработки своего продукта такую компанию у него либо мозгов нет, либо денег. Виноват по большей части он сам.

Серьезно, хватит флудить. Человеку тред для дела нужен.

Nucleus-
()
Ответ на: комментарий от gssomi

Не суть. Главное — он реальный и за него люди будут платить деньги, или это просто студенческая поделка? Вот в чем вопрос. Все-таки если вы потратите больше времени на теорию, и строже подойдете к архитектуру, в итоге вы можете получить хорошего заказчика на будущие продукты, а это уже больше похоже на «стабильную» работу. В противном случае можно получить прямо противоположное, а еще сверху и плохую рекомендацию, если населенный пункт не очень большой :)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Главное — он реальный и за него люди будут платить деньги, или это просто студенческая поделка? Вот в чем вопрос.

мне деньги платят, но это для нашей компании.

gssomi ★★
() автор топика

Вот превратилось оно у меня в кашу с говнокодом. Теперь вопрос как лучше сделать для Users.

1) Сделать модель User, и разделить контроллер и вид по namespace'ам.-> делаю так но проект у меня превращается в битрикс.

2) Не разделять Users по namespace'ам, затем в рутинге перенаправить по namespace'ам.

Да и вообще я запуталась -_- и с браузера запрос не отправляется.

gssomi ★★
() автор топика

cast Nucleus-. Как сделать сессию, у меня для регистрации модель одна для всех, контроллер и вид разделены на 3(public, user, admin). Сессию сделала для всех один контроллер и вид, но все тесты проваленные выходят даже те которые изначально проходили. вот роуты http://rghost.ru/889FcLmB4.view

gssomi ★★
() автор топика
Ответ на: комментарий от gssomi

Не совсем понимаю задачу, если честно, и что там тесты проверяют тоже не знаю. Вот тут смотрела https://www.youtube.com/watch?v=Hw6WtWJwRtU ? Там показано как с нуля это дело реализовать.

Вообще, если цель не в том, чтоб научиться с нуля велосипеды писать, я бы взял Devise или Sorcery. Там это все есть уже.

Nucleus-
()

Здравствуйте Nucleus-! Дело вот в чем я сгенерировала модель LogTime(в базе должно создаваться для каждого сотрудника свой отдельный лог тайм, в котором будет фиксироваться дата+время, начало рабочего дня и конец.)

rails generate model LogTime start_time:datetime end_time:datetime user_id:integer

а после когда хотела запустить rails c он мне выдает ошибку
$ rails c
/home/gssomi/.rvm/gems/ruby-2.0.0-p643@railstutorial_rails_4_0/gems/activesupport-4.1.15/lib/active_support/dependencies.rb:241:in `load': /home/gssomi/rails_projects/lafa_net/config/routes.rb:16: syntax error, unexpected tSYMBEG, expecting keyword_do or '{' or '(' (SyntaxError)
  resources :log_times, controller: 'admin...
             ^
/home/gssomi/rails_projects/lafa_net/config/routes.rb:16: syntax error, unexpected ',', expecting keyword_end
... controller: 'admin/log_times', only: [:index, :new, :create...

а в роутах все вот так
resources :log_times, controller: 'admin/log_times', only: [:index, :new, :create, :destroy]
  resources :log_times, controller: 'user/log_times',  only: [:history, :show, :edit, :update]

Из-за чего выводиться такая ошибка?

gssomi ★★
() автор топика
Ответ на: комментарий от gssomi

Хэй. Покажи полностью routes.rb.

resources :log_times, controller: 'admin/log_times'
resources :log_times, controller: 'user/log_times'

А ты уверена, что это все нужно тут? Мне кажется, достаточно один раз определить log_times и в моделях уже выставить нужные ассоциации. Зачем там controller?

Nucleus-
()
Ответ на: комментарий от Nucleus-
 resources :users, controller: 'public/users', only: [:new, :create]
  resources :users, controller: 'admin/users',  only: [:index, :destroy]
  resources :users, controller: 'user/users',   only: [:edit, :update, :show]

  resources :sessions, only: [:new, :create, :destroy]

  root to: "public/page#index"

  get    '/signup',   to: 'public/users#new',  as: 'signup'
  get    '/signin',   to: 'sessions#new',      as: 'signin'
  delete '/signout',  to: 'sessions#destroy',  as: 'signout'
  get    '/user/:id', to: 'user/users#edit',   as: 'show'
  get    '/users',    to: 'admin/users#index',
 
  resources :log_times, controller: 'admin/log_times', only: [:index, :new, :create, :destroy]
  resources :log_times, controller: 'user/log_times',  only: [:history, :show, :edit, :update]



А ты уверена, что это все нужно тут?

когда создавала конроллеры они сами так создались, ну не совсем так я их отредактировала чутка. А было так

namespace :admin do
    resources :log_times
  end

  namespace :user do
    resources :log_times
  end
Прочла вот это.
Для контроллеров в пространстве имен можно использовать обозначение директории. Например:

resources :user_permissions, controller: 'admin/user_permissions'

gssomi ★★
() автор топика
Последнее исправление: gssomi (всего исправлений: 1)
Ответ на: комментарий от Nucleus-

-_-, вот я слепая дура. Спасибо большое.

gssomi ★★
() автор топика

Nucleus-У меня проблемы с отправкой даты в бд. общее описание, при клике на кнопку start time в базе должно создаваться запись, с user_id = current_user.id и start_time = Time.zone.now.to_s. Затем при клике на end time созданная запись должна обновиться и добавиться запись в столбец end_time. все это работает в rails c

log_time = LogTime.create(:start_time => Time.now.to_s,  :user_id => 6)
log_time.update_attributes(:end_time => Time.now.to_s)

в итоге получаю желаемое
 id |     start_time      |      end_time       | user_id |         created_at         |         updated_at         
----+---------------------+---------------------+---------+----------------------------+----------------------------
 27 | 2016-04-20 09:47:23 | 2016-04-20 09:47:49 |       6 | 2016-04-20 09:47:23.553694 | 2016-04-20 09:47:49.405505
(1 строка)

Но как это реализовать в веб-морде?
метод create и new такой
def new
  @log_time = LogTime.new
end
def create
  @log_time = LogTime.new(params[:log_time])
  if @log_time.save
      flash[:success] = "Time log на сегодня создан!"
      redirect_to edit_log_time_path(@log_time)
  else
      render "new"
  end
end

private
    def log_time_params
	  params.require(:log_time).permit(:user_id => current_user.id, :start_time => Time.zone.now.to_s)
    end

А вот на модели что-то остановилась, и никак не получается.

gssomi ★★
() автор топика
Ответ на: комментарий от gssomi

Правильно понимаю, что первая проблема в том, что лог создается без user_id и start_time? А вторая в том, что не знаешь как end экшн реализовать?

Nucleus-
()
Ответ на: комментарий от Nucleus-

Правильно понимаю, что первая проблема в том, что лог создается без user_id и start_time?

почти, лог создается без start_time.

А вторая в том, что не знаешь как end экшн реализовать?

к этому еще не пришла. Пока решаю первую, но в контроллере записала так

def edit
    log_time = LogTime.find_by_id(params[:log_time])
end
def update
    log_time = LogTime.find_by_id(params[:log_time])                        
    log _time.update_attributes(log_time_params_end)
    flash[:success] = "Данные обновлены."
    redirect_to root_path
end

private
     def log_time_params_end
	 params.require(:log_time).permit(:end_time => Time.zone.now.to_s)
     end

gssomi ★★
() автор топика
Ответ на: комментарий от gssomi

Через permit такое не передают, максимум через merge и то это не очень подход. Если ассоциации настроены, то лучше вообще вот так создавать

current_user.log_times.new(..)

А насчет start_time, если про сервисные объекты еще не читала, то можно через callback в модели дату обновлять. Например:

before_create :set_start_time

Если совсем уж нормально сделать, то прочитай про сервисные объекты и создай CreateLogService, в него передай current_user.id и log, и в самом сервисе проставь атрибуты и сохрани. Выглядеть это примерно так будет:

CreateLogService.call(current_user.id, log)

То же самое можно с FinishLog сделать, чтоб контроллер не захламлять.

Nucleus-
()
Ответ на: комментарий от Nucleus-

ого, спасибо.

А вообще, почему бы created_at не использовать в качестве start_time? И телодвижений лишних не будет :)

в начале так и было, потом директор сказал «Нет, так не пойдет. Нужно именно в start_time записывалось».

gssomi ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.