0

我是 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

4 回答 4

1

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

至于风格,这整个例子是非常错误的。如果你不按照 Rails 风格做事,你就要求痛苦。

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

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 方法可以创建一个新用户并像标准脚手架一样保存。

于 2012-07-24T13:58:00.487 回答
0

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

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

于 2012-07-24T12:32:09.880 回答
0

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

于 2012-07-24T12:02:31.743 回答
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 并在控制台中显示结果。

于 2012-07-24T11:43:56.800 回答