【问题标题】:How to access a single, visible element from an array of objects being displayed by will_paginate?如何从 will_paginate 显示的对象数组中访问单个可见元素?
【发布时间】:2015-05-03 12:37:05
【问题描述】:

我正在开发一个管理学生和课程的 Rails 网络应用程序。我有一个具有以下索引操作的课程控制器:

  def index

    @courses = Course.paginate(:page => params[:page], :per_page => 1)
    @courses.order(:startDate)
    #@thisCourse = Course.find(params[:page])

  end

除了一件事之外非常标准 - 单个课程的所有详细信息都显示在一个页面上,并且要显示下一个课程的详细信息,您将转到分页的下一页。

问题是,在这个显示每个分页 1 门课程详细信息的索引页面中,我有一个“注册!”按下按钮时需要在“注册”数据库表中创建一个新记录,该表具有自动“id”字段,然后是“user_id”和“course_id”字段。

“user_id”很容易找到 (current_user.id)。

“course_id”被证明是困难的。我想按下 Signup 按钮应该将 course_id 发送到 signups_controller,创建函数可以在其中完成工作。但是我怎样才能从索引页面获取这个确切的课程 ID 到 signups_controller 的创建操作?

正如您在我从课程控制器的索引操作中粘贴的代码中看到的那样,“@thisCourse”变量已被注释掉,因为我无法定义页面上当前显示的课程。

这些字段由 will_paginate Gem 呈现,所以我不确定它是如何生成字段的,但我想也许我可以创建一个包含 course_id 的命名隐藏字段,并在按下注册按钮时使用它,但是我不知道该怎么做。

有人有什么想法吗? 谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    好吧,您可以使用show 方法(输出一门课程)而不是index(输出所有课程)方法,这将始终通过id 获得您的课程params

    【讨论】:

    • 谢谢,我曾想过,但要达到“显示”方法,我必须使用索引作为索引,然后让用户点击进入课程。也许这更合乎逻辑,但我不知道。我觉得这对用户来说是不必要的点击。
    • @user3535074:这似乎更方便 - 用户可以一键找到任何课程,而不是从 1 到 n 页搜索以找到他想要的课程。
    • 我理解您的意思,但课程数量将很少 - 最多只有 2 或 3 门是学生可以注册的未来课程,而且它们始终是您看到的第一门课程。无论如何,您可能是对的……课程详细信息 HTML 由 form_for 生成。也许如果我在 form_for 中创建一个调用特定控制器和操作的提交按钮,它将向注册控制器传递课程的所有详细信息。我不确定它是否可能 - 必须阅读......
    【解决方案2】:

    基本上我改变了解决问题的方法。我删除了应该调用 signups_controller 并在 signups 表中创建新记录的按钮。这个按钮被替换为调整 form_for 助手,以便它的提交按钮将所有必要的数据发送到 signups_controller(包括作为隐藏字段添加到表单中的 id 值)。

    表格最终看起来像这样:

    <%= form_for course, :url => {:controller => "signups", :action => "create"}, :method => "post" do |f| %>
    
        <%= hidden_field_tag :course_id, course.id %>
    
        <%= f.label :"Course Title" %>
        <%= f.text_field :courseTitle, class: 'form-control' %>
    
        + all fields included in the form....
    
        <%= f.submit "Sign Up!", class: "btn btn-primary" %>
    
    <% end %>
    

    form_for的这个参数定义了哪个控制器和那个控制器中的哪个动作是提交目标:

    :url => {:controller => "signups", :action => "create"}
    

    并且此参数会覆盖默认的 http 操作(默认为 PATCH,但在这种情况下我想发布,即在注册表中创建一个新条目):

    :method => "post"  
    

    我不确定这是否是一个非常快速和肮脏的解决方案,但从技术上讲,它可以将必要的数据发送到正确的目标控制器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多