为什么这个代码在控制器内部使用时抛出错误,而不是视图?

时间:2017-06-14 03:03:06

标签: ruby sinatra rack

我有以下型号:

g <- make_ring(10) %>% set_vertex_attr("name", value = LETTERS[1:10])

ui <- fluidPage( 
  titlePanel("Delete vertices in graph"),
  sidebarLayout(
    sidebarPanel(
      selectInput("vertexToDelete", "Vertex to delete", choices=V(g)$name),
      actionButton("goButtonDelete", "Evaluate")
    ),
    # Show a plot of the graph
    mainPanel(plotOutput("graphPlot"))
  )
)

server <- function(input, output, session) {
  my <- reactiveValues(g=g)

  observeEvent(input$goButtonDelete,{
    my$g <- delete_vertices(my$g, input$vertexToDelete)
    updateSelectInput(session, "vertexToDelete", choices=V(my$g)$name)
    })

  output$graphPlot <- renderPlot(plot(my$g))
}

shinyApp(ui = ui, server = server)

此工作正常,并允许人们注册该网站。但是,我接着定义了以下路线:

class User

include DataMapper::Resource

property :id,     Serial
property :name,   String, required: true
property :email,   String, required: true, unique: true
property :password_digest, Text
attr_reader :password
attr_accessor :password_confirmation

validates_confirmation_of :password
validates_format_of :email, as: :email_address

has n, :victories

现在,该应用程序仍将运行,但当我尝试访问&#39; / users / all&#39;时,我会收到#34;此网站无法访问&#34;和以下终端错误:

get 'users/all' do
  @users = User.all
  @users.each do |user|
    user.name
  end
end

当我在视图中包装此逻辑时,它可以工作:

ERROR Rack::Lint::LintError: Body yielded non-string value #<User @id=1 @name="Iain K" @email="test@googlemail.com" @password_digest=<not loaded>>

内部用户/ all.erb:

get 'users/all' do
  @users = User.all
  erb(:'users/all')
end

这是为什么?

感谢所有帮助。

感谢。

1 个答案:

答案 0 :(得分:4)

在一天结束时,您的控制器需要返回一个字符串。 erb :'users/all'返回一个字符串。

让我们回过头来看看你现有的代码,特别是这个:

  @users.each do |user|
    user.name
  end

这里的街区基本没有效果; each 会返回修改后的数组(也许您正在寻找map?)

虽然你已经有了将这个逻辑移到视图中的正确想法,但我只是指出原始代码在很多方面都是错误的。