【问题标题】:Submitting a form (no model) and having trouble getting the controller to play its part提交表单(无模型)并且无法让控制器发挥作用
【发布时间】:2012-03-13 01:27:14
【问题描述】:

我已经为 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' => 'namer#create'
  2. 创建了一个重命名器模型。 Models/renamer.rb 只是“class Namer”,然后是“end”。 (我删除了“<:activerecord>
  3. 为重命名代码创建了一个 rake 文件。它只是称为“renamer.rake”。

情况看起来不错,但我仍在寻找一种从控制器调用 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

【问题讨论】:

  • 你能粘贴到你的 routes.rb 中吗?
  • 发布您的routes.rb。什么错误?
  • 我实际上没有收到任何错误。我的问题是重命名应用程序代码没有被执行。

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


【解决方案1】:

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

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

rake namer:rename APP_NAME=NewAppName

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

【讨论】:

  • 同意。这尖叫着“耙任务”。
  • 好的。当用户单击 namer\view.html.erb 中的“重命名您的应用程序”按钮时,如何触发 rake 运行?
  • 重命名是一次性的吗?还是经常发生?
  • 重命名是一次性事件。一旦用户重命名应用程序,就是这样,不再重命名。
  • 我正在努力使上面建议的代码工作(rake namer:rename APP_NAME=NewAppName)。我正在尝试将它放入我的 Create 方法中,如下所示:name:rename appname=@appname。但显然,这不是一个聪明的方法(因为它不起作用)。设置此代码的聪明方法是什么?
【解决方案2】:

您的路线文件没有名称匹配的“帖子”,看起来像。最简单的纠正方法是将这条线放在某个地方。

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

form_tag 助手默认创建一个post-method 表单,如果你正在创建一个资源,这就是你想要的——你只需要确保你的路由在那里。 Rails 可能不会通过底部的包罗万象的路由发送 POST 操作,但最好的做法是确保以某种方式命名您的路由。

就个人而言,我更喜欢资源丰富的路线。 Read up on them here;我保证这是值得的。

(如果这没有帮助……你能检查一下def create 函数中的代码是否真的在触发吗?放入调试器行或puts 语句以找出答案。) em>

【讨论】:

  • 明白了。这有帮助。谢谢。
  • 优秀。那么,您的创建操作是否有效?将我的回复标记为解决方案,让我知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多