我是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
答案 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
。