我在通过Rails中的控制器打印一些数据时遇到了一些问题

时间:2012-07-24 10:42:04

标签: ruby-on-rails ruby

我是Rails的新手。我希望如果一个人在表单上输入“entity1”(或者在下面的代码中出现在名为ENTITIES的列表中的某个其他实体),表单应该显示其关系。检查实体是否包含在实体列表中的任务是成功的,我无法理解如何打印名为RELATION_SHIPS的关系。我试过了:

#puts EntityList::RELATION_SHIPS[params[:user][:entity_name]] 

但它给我一个错误,说明模板丢失或RELATION_SHIPS无法识别。我该如何解决这个问题?

#users_controller.rb

class EntityList

  ENTITIES = ['entity1','entity2','entity3']
  #entity1 = {:name => 'Entity One',:position => 1 :relationships => 'entity2', 'entity4'}

  RELATION_SHIPS = {:entity1 => "entity2", :entity2 => "entity3"}
end

class UsersController < ApplicationController
  layout 'admin'
  #require File.expand_path('././myconfig')  #=> C:/ruby/require/expand_path/ok.rb    loaded

  def new
    @user = User.new
  end

  def create
    if EntityList::ENTITIES.include?(params[:user][:entity_name])
      flash[:notice] = "The entity you entered is valid!!"

      redirect_to(:action => "helloworld")

      #puts EntityList::RELATION_SHIPS[params[:user][:entity_name]]
    else
      redirect_to(:action => "SorryPage")
    end
  end
end

4 个答案:

答案 0 :(得分:1)

首先,尝试使用`Rails.logger.debug'而不是puts。至于模板错误,它可能来自下一个请求 - 你说要重定向到另一个动作。你有'helloworld'和'Sorrypage'的方法和模板吗?

至于风格,整个例子都是非常错误的。如果你不做铁轨风格的事情,你会感到痛苦。

首先,我将EntityList移动​​到模型中,并添加方法来获取信息而不仅仅是公开常量。在您的示例中,您在ENTITIES和RELATION_SHIPS之间存在冗余信息(为什么是下划线?)。铁轨的基本理念是“不要重复自己”。您可以通过仅使用散列并使用散列上的方法来干掉这些常量:

class EntityList

  ENTITIES = {:entity1 => "entity2", :entity2 => "entity3"}

  def self.valid_entity(e)
    ENTITIES.has_key?(e)
  end

  def self.entity_name(e)
    ENTITIES[e]
  end

end

然后在控制器中使用它:

  def create
    if EntityList.valid_entity(params[:user][:entity_name])
      flash[:notice] = "The entity you entered is valid!!"
      redirect_to(:action => "hello_world")
    else
      redirect_to(:action => "sorry_page")
    end
  end

看看这使控制器变得多么短暂和甜美?注意我改变了操作 - 它们应该至少是小写,下划线,以匹配rails约定,尽管如果他们转到REST样式操作会更好。

确保您的路线文件已设置为接受它们,并且您拥有这些操作的方法和模板。

最后,参数表明这是带有用户对象的表单的一部分......并且通过重定向,您将丢失所有表单数据。你将不得不解决这个问题。实际上,整个ENTITY事物应该是User模型中的验证,然后create方法可以创建一个新用户并像标准支架一样保存。

答案 1 :(得分:0)

redirect方法后你无法做任何事情。你必须在......之前这样做。

修改:添加代码

  def create
    if EntityList::ENTITIES.include?(params[:user][:entity_name])
      flash[:notice] = "The entity you entered is valid!!"
      puts EntityList::RELATION_SHIPS[params[:user][:entity_name]]
      redirect_to(:action => "helloworld")
    else
      redirect_to(:action => "SorryPage")
    end
  end

创建app / views / users / helloworld.html.erb并在控制台中显示结果。

答案 2 :(得分:0)

正如Dougui所说,重定向方法后你无能为力。此外,如果您尝试在浏览器中打印关系,则必须在“视图”中打印它。 'Puts'方法将在命令提示符下打印任何内容。

答案 3 :(得分:0)

这里存在一个明确的问题,可能存在问题。可能的问题是,当您puts一个字符串时,该输出会出现在终端中,而不会出现在发送到Web浏览器的输出中。如果您希望输出显示在Web浏览器中,您需要以某种方式将其放在视图中 - 通过在控制器中设置@variable,或在控制器中创建helper_method并从视图中调用它(后者是我的首选方案)。但是,对于调试输出,使用put并在终端(用于rails s)或日志(用于pow,乘客或类似用途)上输出是正常的。

明确的问题是,如果你puts nil,我不希望看到任何输出(换行除外)。您的RELATION_SHIPS哈希的键是符号。 params[:user][:entity_name]是一个字符串。在由符号键入的哈希中查找字符串将返回nil,根据关于puts nil的观察 - 这有点无聊。你可能想要RELATION_SHIPS一个具有无差别访问权限的哈希,尽管你可能想要在你用来键入它的值上调用.to_sym