【问题标题】:list and create on one page rails 3在一页上列出并创建 rails 3
【发布时间】:2011-07-12 08:18:31
【问题描述】:

我想制作一个仪表板页面,顶部有一个创建操作(表单),下面有一个列表操作...(显示所有已提出的问题)我想知道最好的方法是什么.

我有一个带有列表和创建操作的 QuestionsController。所以我确实需要用 createlist 操作制作一个 DashboardController ......?然后从 QuestionController 渲染两个模板...?

或者我是否需要使用列表创建一个 DashboardController 并参考 Questions 模型在它们上创建操作?

最好的问候, 泰斯

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord actioncontroller


    【解决方案1】:

    您应该创建 QuestionsController,将表单部分包含在索引视图中。这个表单应该简单地跟随创建动作,并且这个动作应该在错误时(记住可能存在验证错误)渲染索引动作,成功后它应该重定向回索引。

    除非您还需要从其他地方创建问题,否则会更复杂。

    更新

    您也可以创建 DashboardsController,但我只会使用它来显示仪表板(显示操作和单一资源,而不是 routes.rb 中的资源),然后通常按照新的问题表单到 QuestoinsController#create,并重定向回 DashboardsController #显示。这样,如果您还在仪表板上显示多个资源类型,则更加 RESTful,因为您显示的是单一仪表板(带有问题和其他资源),但您遵循 QuestionsController#create 来创建问题。

    更新 2

    如果您(或其他任何人需要)将它放在一个地方:

    1. 在您的routes.rb 文件中定义资源:

      resources :questions
      
    2. 在你的QuestionController:

      class QuestionsController < ApplicationController
        def index
          setup_questions
        end
      
        def create
          @question = Question.new(params[:question])
          if @question.save
            redirect questions_path, :notice => "Successfully created question."
          else
            setup_questions
            render :action => :index
          end
        end
      
        private
      
        def setup_questions
          @questions = Question.order(:name).page(params[:page])
          # or any other method to fetch all your questions
      
          @question ||= Question.new
        end
      end
      
    3. 在您的app/views/questions/index.html.erb 视图中:

      <% @questions.each do |question| %>
        <%# display question as table row %>
      <% end %>
      
      <% render :template => "form", :locals => {:question => @question} %>
      
    4. app/views/questions/_form.html.erb 中,您只需为新问题定义标准形式:

      <%= form_for question do |f| %>
        <%# form fields %>
      <% end %>
      

    那么您不需要查看new 操作,因为此操作只会显示新问题的表单,而您在index 操作中有此表单。

    【讨论】:

    • 好的,现在我已经将索引操作放在新的表单中,我说要渲染索引模板,但是它得到了错误,它缺少 @questions = Question.all 所以我必须将此添加到控制器中的新操作中...但是没有更好的方法吗,我重复一遍,因为它已经在索引操作中...
    • 没错,您需要在两个操作中设置索引视图所需的所有数据(在渲染时创建:索引)。如果您有更多数据要设置,您可以在控制器中定义方法并从两个操作中调用此方法,我可能会这样做。
    • 好的,那么这可能是最好的方法...?或者也许我可以为控制器做一个表单并定义它的动作...... {:controller => :question, :action => :create } %> 当我调用 _form部分...
    • 如果你有新实例化的问题(控制器中的@question = Question.new),那么你只需要form_for @question do...,你不需要指定:url。当然,如果您的 routes.rb 文件中有 resources :question 来定义问题的命名路由
    • 哇,谢谢,我要试试!一个小问题: :page 是另一个模型的东西吗? @questions = Question.order(:name).page(params[:page]) 再次感谢您抽出宝贵时间!!
    【解决方案2】:

    您可以在例如索引页面上将这两者结合起来。生成带有form_for(@question) 块的表格并显示@questions 的集合。当然,您应该在控制器的索引操作中定义@question@questions

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      相关资源
      最近更新 更多