戏剧将对象转换为字符串

时间:2012-03-13 19:36:53

标签: ruby-on-rails string controller

我正在开发一个包含CMS webapp基本元素的webapp。用户可以克隆存储库,运行rails服务器,然后转到允许他们将应用程序从当前名称“框架”重命名为任何他们想要的页面。经过一番争论here之后,我决定将重命名代码放入我的控制器中(而不是在rake文件中)。但我的问题是我的控制器无法弄清楚发生了什么。这就是我的观点。

<h1>Rails Framework</h1>

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

<% end %>

这是我的控制者。

class NamerController < ApplicationController

  def index
    render('new') 
  end  

  def new
    @appname = Namer.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 rootpath 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

我还有一个名为renamer的模型。这是非常基本的。我删除了“&lt; Base :: ActiveRecord”,因为此重命名过程中没有涉及数据库。

class Namer 
end

我的问题是,当我在表单中输入新名称时,rails会返回错误信息:

TypeError in NamerController#create.  Can't convert Namer into String.

我不确定为什么它急于将Namer变成字符串,因为我认为它只是将@appname变量用作字符串。关于为什么失败的任何想法?

更新:所以我对原始代码进行了一些更改,现在看起来是这样的。由于某种原因,代码成功运行并对其应该执行的某些文件进行名称更改。

class NamerController < ApplicationController

  def index
    render('new') 
  end  

  def new
  end

  def create
    #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", params[:appname]) }
    end
    #next,change the rootpath 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") }
    File.open(file_name, "w") { |file| file << text.gsub("post '/namer' => 
      'namer#create'", "") }
    flash[:notice] = "Enjoy your app."
    redirect_to(root_path)
  end 

end

出于某种原因,当代码半成功时,它最终删除了所有的congig / environments / test.rb文件,看起来像这样。

Framework::Application.configure do

  config.cache_classes = true
  config.serve_static_assets = true
  config.static_cache_control = "public, max-age=3600"
  config.whiny_nils = true
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false
  config.action_dispatch.show_exceptions = false
  config.action_controller.allow_forgery_protection    = false
  config.action_mailer.delivery_method = :test
  config.active_support.deprecation = :stderr
  config.assets.allow_debugging = true
end

我不小心移动了routes路径文件夹中的一行,这不知何故使重命名代码无法运行。 (不知道为什么)。所以我认为它可能与test.rb文件清空所有文本的问题有关。这是我的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'


  post '/namer' => 'namer#create'    
  root :to => "namer#new"
  match ':controller(/:action(/:id(.:format)))'
end

解: 这就是我的Create方法最终看起来像。现在它就像我想要的那样工作。

  def create
    #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", params[:appname])}
    end
    #next,change the rootpath 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") }

    file_name ='config/routes.rb'
    text = File.read(file_name)    
    File.open(file_name, "w") { |file| file << text.gsub("post '/namer' => 
       'namer#create'", "") }
    flash[:notice] = "Enjoy your app."
    redirect_to(root_path)
  end 

1 个答案:

答案 0 :(得分:0)

这一行:text.gsub("Framework", @appname)是问题所在。当你传递一个完整的对象@appname时,gsub正在寻找一个字符串/模式作为第二个参数。试试@appname.to_s

<强>更新

您可以使用@appname替换gsub中的param[:appname]并完全避开该类。

或者在Namer中你可以这样做:

class Namer
    attr_accessor :appname
end

然后执行:

def create
    @appname = Namer.new 
    @appname.appname = params[:appname]  @appname.appname
    ...
    text.gsub("Framework", @appname.appname)
    ...
end