提交表格(没有型号)并且无法让控制器发挥其作用

时间:2012-03-13 01:27:15

标签: ruby-on-rails ruby forms erb rails-routing

我已经为webapps创建了一个基本框架(一些静态页面,用户身份验证,使用rspec进行单元/集成测试)。我想将此作为未来webapps的基础,但我需要设置一种方法,在从github克隆它之后重命名它。我在这里帮助生成了重命名代码] 1,但我很难弄清楚如何整合它。

我最初写的是在rakefile中重命名代码,但现在我想也许它应该在控制器中。不幸的是,我无法使我的代码工作。我有一个允许用户输入应用程序新名称的视图。想法是用户将克隆框架repo,cd到框架目录,启动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

知道我做错了吗?

另外,控制器真的是“重命名”代码的最佳位置吗?

编辑:这是我的routes.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'=&gt; 'namer #create'
  2. 创建了Renamer模型。 Models / renamer.rb只是“类名”,然后是“结束”。 (我删除了“&lt; Base :: ActiveRecord”,因为没有涉及数据库。)
  3. 为重命名代码创建了一个rake文件。它只是叫做“renamer.rake”。
  4. 事情看起来不错,但我仍在寻找一种从控制器调用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 个答案:

答案 0 :(得分:2)

好的,问题的第二部分---这是您的代码重命名应用程序的正确位置吗?

不,我不会把它放在那里。我会把它作为rake任务(lib / tasks / namer.rake),你可以:

rake namer:rename APP_NAME=NewAppName

这将执行重命名。这就是我有这个代码的地方。

答案 1 :(得分:0)

你的路线文件没有名字命名的“帖子”匹配,看起来像。最简单的方法就是把这条线放在某个地方。

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

form_tag帮助器默认创建post - 方法表单,如果您正在创建资源,那就是您想要的 - 您只需要确保您的路由是它。 Rails可能不会通过底部的catch-all路径发送POST操作,但更好的做法是确保以某种方式命名路由。

就个人而言,我尽可能选择资源丰富的路线。 Read up on them here;我保证这是值得的。

(如果这没有帮助......你能检查def create函数中的代码是否实际触发吗?请调试调试器行或puts语句以查找。)