Идентичные файлы ведут себя по-разному из-за связи с контроллером - PullRequest
1 голос
/ 13 января 2011

Я создаю свое первое приложение с ROR и наткнулся на пару проблем из-за моего понимания MVC

У меня есть страница для добавления нового элемента, и это прекрасно работает, рельсы волшебным образом подключают его к контроллеру элементов и каким-то волшебным образом он знает, как искать в методе «новый», когда страница называется новой. *

Но этот слой меня смущает, так как мне нужно сейчас создать другую версию новой, той же функциональности, но с другим внешним видом, чтобы использовать другой макет для application.html.erb

Поэтому я пытаюсь создать копию new.html.erb и создать bookmarklet.html.erb - оба они содержат абсолютно одинаковый код: ссылку на форму. но, конечно, bookmarklet выдаст ошибку, потому что у него нет этой ссылки в контроллере - как мне «подключить» букмарклет, чтобы я мог вызывать новый метод и чтобы он мог вести себя так же, как и новый. html.erb

Кроме того, как я могу сказать новому bookmarklet.html.erb игнорировать application.html.erb и получить его макет из другого файла?

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 13 января 2011

Волшебство происходит на маршрутах. Rails использует так называемые маршруты RESTful, которые принимают HTTP-глаголы и назначают для них стандартные действия. действие new - это запрос GET на языке HTTP, и если вы используете scaffolding или следите за REST, у вас будет вызов ruby ​​для создания нового объекта в контроллере в качестве переменной экземпляра, чтобы вы могли использовать его в своем представлении.

Вы должны указать рельсовым маршрутам, что вы хотите сломать это соглашение, и разрешить / items / bookmarklet использоваться в контроллере.

В вашем файле rout.rb замените resources :items на

resources items do
  member do
    get 'bookmarklet'
  end
end

В вашем контроллере положить:

def bookmarklet
  @item = Item.new
  render :template => "bookmarklet", :layout => "different_layout" # or you can put this on the top of the controller, which is my style, but whatevs.
end

Вам следует изучить partials , если вы делаете это, поскольку они очень сильно очищают ваш код.

0 голосов
/ 13 января 2011

Лучший способ подумать о том, чтобы начать с контроллера вместо просмотра файлов html.erb.Таким образом, каждый публичный метод в вашем контроллере фактически является страницей или действием на сайте.Когда вам нужно новое действие или страница, сначала добавьте метод в контроллер.Затем создайте соответствующие файлы представлений.

Итак, в вашем контроллере вам понадобится что-то вроде:

def bookmarklet
  @item = Item.new(params[:item])
  @item.save
  render :template => "items/bookmarklet.html.erb", :layout => "different_layout.html.erb"
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...