【问题标题】:Render not rendering right page渲染不渲染正确的页面
【发布时间】:2011-03-19 08:32:45
【问题描述】:

这可能无法回答,因为这里可能有太多变量,但我想我会试一试,因为我总是在这里找到其他答案。我对 Rails 还是很陌生。

所以,我有一个账单模型/控制器/视图。我想创建一个新账单。我将编辑掉那些不应该很重要的东西,但如果需要它们,我可以添加它们——只是不想要一堵文字墙。

在路线中:

map.resources :bills

我在控制器中的新方法:

def new
    @bill = Bill.new
    @submit_txt = "Create"

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @bill }
    end
  end

我的表格:

<% form_for(@bill) do |f| %>
        <%= f.error_messages %>
 ### form elements here, this all seems fine ####
        <p>
          <%= f.submit @submit_txt %>
        </p>
    <% end %>

我在控制器中的创建方法:

def create
    is_weekly = false
    is_monthly = false

    @bill = current_user.recurring_bills.build(params[:bill])
    @bill.year = @current_year

    @errors = 'checking this out'

    if @errors.blank?
      logger.info "no errors, supposedly; going to save"

     ### do saving stuff here####
    else
      logger.info "errors not blank"
      render :action => :new
    end
end

由于某种原因,这总是呈现 /bills 而不是 /bills/new。它曾经有效,我不知道我做错了什么,但现在不是。我得到与渲染相同的响应:template => 'bills/new'。它会通过重定向转到正确的页面,但不会使用旧值填写表单。

日志:

Processing BillsController#create (for 127.0.0.1 at 2010-07-21 21:00:47) [POST]
  Parameters: {"commit"=>"Create", "action"=>"create", "authenticity_token"=>"Kc7/iPKbfJBKHHVARuN7K6207tW6Jx4OUn7Xb4uSB8A=", "bill"=>{"name"=>"rent", "month"=>"", "amount"=>"200", "alternator"=>"odd", "day"=>"35", "frequency"=>"monthly", "weekday"=>""}, "controller"=>"bills"}
  User Load (0.6ms)   SELECT * FROM "users" WHERE ("users"."remember_token" = 'dd7082c56f5a252d14e4e68c528eb26551875c647f998c15d16a064cb075d63c') LIMIT 1
errors not blank
Rendering template within layouts/application
Rendering bills/new
Rendered bills/_form (14.5ms)
Rendered layouts/_stylesheets (3.3ms)
Rendered layouts/_header (5.7ms)
Rendered layouts/_footer (0.3ms)
Completed in 174ms (View: 30, DB: 1) | 200 OK [http://localhost/bills]

希望有人知道我做错了什么,或者我想我要重新开始了。

【问题讨论】:

  • my_form 是部分的,还是 new.html.erb?
  • 对不起,是的,表单是部分的,我正在尝试在新方法和编辑方法中使用它。我会尝试我认为可能是您的下一个答案 - 将它从部分文件中取出并放入主文件中,看看它会做什么。
  • 很好奇,问题出在哪一行:Completed in 174ms (View: 30, DB: 1) | 200 OK [http://localhost/bills]?因为它似乎正在渲染正确的页面:Rendering bills/new,只是它不会运行new 操作,只渲染页面。我是不是已经离开基地了?
  • 我想就像你说的那样 - 渲染正确的页面但不是正确的操作。这很奇怪,因为它确实再次调出表单(票据索引方法应该只是调出票据列表。)
  • 看的更近一些(现在我已经退后了一点),似乎问题出在部分问题上,或者更确切地说是我为提交按钮设置的变量(我还需要在 create 方法中进行设置)。故事的寓意似乎是正在运行正确的操作,但 url 显示的是“bills”而不是“bills/new”;这是预期的结果吗?我从来没有注意到这一点。表格仍然没有用旧值填写,但这是我需要的表格,我可以在接下来的工作。感谢大家的帮助!

标签: ruby-on-rails ruby render


【解决方案1】:

从命令行运行rake:routes,您将看到它们是如何映射的。

    bills GET    /bills(.:format)          {:controller=>"bills", :action=>"index"}
          POST   /bills(.:format)          {:controller=>"bills", :action=>"create"}
 new_bill GET    /bills/new(.:format)      {:controller=>"bills", :action=>"new"}
edit_bill GET    /bills/:id/edit(.:format) {:controller=>"bills", :action=>"edit"}
     bill GET    /bills/:id(.:format)      {:controller=>"bills", :action=>"show"}
          PUT    /bills/:id(.:format)      {:controller=>"bills", :action=>"update"}
          DELETE /bills/:id(.:format)      {:controller=>"bills", :action=>"destroy"}

RESTful 资源需要一点时间来适应,但在您的情况下,\bills 使用 post 方法进入创建操作。当您调用 render :action =&gt; :new 时,您在 create 操作中指定呈现 new 模板的内容 - 您实际上并没有运行该操作。

【讨论】:

  • 给出的两个答案都非常有帮助,但我不知道 rake:routes,这很好地解释了发生的事情的顺序。谢谢!
【解决方案2】:

试试这个:

render :new

来自文档:

将渲染与 :action 一起使用是 Rails 新手经常感到困惑的原因。指定的操作用于确定要呈现哪个视图,但 Rails 不会在控制器中运行该操作的任何代码。您在视图中需要的任何实例变量都必须在调用渲染之前在当前操作中设置。

试一试,告诉我们进展如何。此外,如果您渲染“新”,请记住您的新操作会创建一个新的 Bill 对象,并且不会有任何旧值可供填充。我认为您真正想要做的是渲染:编辑。并在您的编辑操作中找到带有您传递给操作的参数的 Bill 对象。

【讨论】:

  • 嗯,还是一样的问题。也许我只是以错误的方式这样做 - 这里的想法是这个人正在尝试创建一个新账单,但是出了点问题,所以它使用他们已经输入的信息再次呈现新页面。这应该是编辑页面吗?我假设这将是已经保存在数据库中的项目。