Отправка формы (без модели) и проблемы с тем, чтобы заставить контроллер играть свою роль - PullRequest
0 голосов
/ 13 марта 2012

Я создал базовую платформу для веб-приложений (некоторые статические страницы, аутентификация пользователя, модульное / интеграционное тестирование с помощью rspec). Я хотел бы использовать это в качестве основы для будущих веб-приложений, но мне нужно настроить способ его переименования после клонирования из github. Мне помогли с генерацией кода переименования здесь] 1 , но я пытаюсь понять, как его интегрировать.

Я изначально писал, что код переименования был в rakefile, но теперь я думаю, что, возможно, он должен быть в контроллере. К сожалению, я не смог заставить мой код работать. У меня есть представление, которое позволяет пользователю вводить новое имя для приложения. Идея состоит в том, что пользователь клонирует репозиторий фреймворка, перейдет в каталог фреймворка, запустит сервер rails, а затем перейдет на локальный хост в своем браузере, чтобы переименовать файл оттуда. Но представление, которое должно быть включено, не работает.

views/namer/new/html.erb

  <h1>Rails Framework</h1>

  <%= form_tag "/namer" do %>
  <%= text_field_tag "appname" %>
  <%= submit_tag "Name Your App" ,  :action => 'create' %>
  <% end %>

Я не могу заставить действие "отправить" работать правильно. Вот как выглядит мой контроллер.

controllers/namer_controller.rb
  class NamerController < ApplicationController


      def index
        render('new') 
      end  

      def new
      end

     def create
       @appname = Namer.new(params[:appname])
       #first, change any instances of the term "framework" to the new name of the app   
       file_names = ['config/environments/test.rb', 'config/environments/production.rb',
               'config/environment.rb']
       file_names.each do |file_name|
         text = File.read(file_name)
         File.open(file_name, "w") { |file| file << text.gsub("Framework", @appname) }
       end
       #next,change the root path away from namer#new
       file_name ='config/routes.rb'
       text = File.read(file_name)
       File.open(file_name, "w") { |file| file << text.gsub("namer#new", "pages#home") }
       flash[:notice] = "Enjoy your app."
       render('pages/home')
     end 

   end

Есть идеи, что я делаю не так?

Кроме того, действительно ли контроллер является лучшим местом для «переименования» кода?

edit: вот мой файл route.rb.

Framework::Application.routes.draw do


  resources :users
  resources :sessions, :only => [:new, :create, :destroy]

  match '/signup',  :to => 'users#new'
  match '/signin',  :to => 'sessions#new'
  match '/signout', :to => 'sessions#destroy'

  match '/contact', :to => 'pages#contact'
  match '/about',   :to => 'pages#about' 
  match '/help',    :to => 'pages#help'

  root :to => "namer#new"

  match ':controller(/:action(/:id(.:format)))'

ОБНОВЛЕНИЕ: я изменил свой код несколькими способами.

  1. Маршруты: добавлено сообщение '/ namer' => 'namer # create'
  2. Создана модель Renamer. Models / renamer.rb - это просто «имя класса», а затем «конец». (Я удалил «
  3. Создан файл граблей для кода переименования. Это просто называется "renamer.rake".

Все выглядит хорошо, но я все еще ищу способ вызвать файл рейка с контроллера. Есть предложения?

ОБНОВЛЕНИЕ 2: Вот мой пересмотренный метод Create для моего контроллера. Теперь код переименования здесь, а не в файле rake.

def create
  @appname = Namer.new(params[:appname])
  file_names = ['config/environments/test.rb', 'config/environments/production.rb', 
    'config/environment.rb']
  file_names.each do |file_name|
  text = File.read(file_name)
  File.open(file_name, "w") { |file| file << text.gsub("Framework", @appname) }
  flash[:notice] = "Enjoy your app."
  render('pages/home')
 end

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

ОК, вторая часть вашего вопроса --- это правильное место для вашего кода, который переименовывает ваше приложение?

Нет, я бы не стал это там ставить. Я бы поставил это как грабли (lib / tasks / namer.rake), где вы бы:

rake namer:rename APP_NAME=NewAppName

Это выполнит переименование. Вот где у меня был бы этот код.

0 голосов
/ 13 марта 2012

Ваш файл маршрутов не имеет соответствия "post" для namer, похоже.Самый простой способ исправить это - поместить эту строку куда-нибудь.

post '/namer' => 'namer#create'

Помощник form_tag по умолчанию создает форму post, а если вы создаете ресурс, вот чтоВы бы хотели - вам просто нужно убедиться, что ваш маршрут там.Возможно, что Rails не отправляет POST-действия через универсальный маршрут внизу, но гораздо лучше убедиться, что ваши маршруты каким-то образом названы.

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

(Если это не поможет… можете проверить, действительно ли код в вашей функции def create срабатывает? Оставьте строку отладчика или puts заявление, чтобы узнать.)

...