【问题标题】:Controller action not being found when passing an options hash for specific controller and action in a form_for block在 form_for 块中传递特定控制器和操作的选项哈希时找不到控制器操作
【发布时间】:2015-07-17 08:07:25
【问题描述】:

我正在尝试基于代表培训课程的对象使用 form_for 在 rails 4 中创建一个表单。在加载页面之前,应用程序会检查当前用户是否已经注册了课程。如果不是,则表单上的提交按钮会创建一个新的“注册”,在注册表中标记课程 ID 和用户 ID。这可以正常工作。

如果用户已经注册,那么我希望提交按钮具有不同的功能 - 为特定注册记录发出获取请求并在屏幕上显示其详细信息。本质上就像重定向到“注册/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' %>

    <%= f.label :"Course Title" %>
    <%= f.text_field :courseTitle, class: 'form-control' %>

    <%= f.label :"Detailed Description Of Course Dates & Times" %>
    <%= f.text_area :courseDatesAndTimes, class: 'form-control' %>

    <%= f.label :"General Course Location eg 'Malaga'" %>
    <%= f.text_field :courseGeneralLocation, class: 'form-control' %>

    <%= f.label :"Exact Course Address including Postal Code" %>
    <%= f.text_field :courseExactAddress, class: 'form-control' %>

    <%= f.label :"Course Description" %>
    <%= f.text_area :courseDescription, class: 'form-control' %>

    <%= f.label :"Maximum Number of Students" %>
    <%= f.text_field :courseMaximumNumberStudents, class: 'form-control' %>

    <%= f.label :"Normal Course Price" %>
    <%= f.text_field :courseNormalPrice, class: 'form-control' %>

    <%= f.label :"'Listener' Course Price" %>
    <%= f.text_field :courseListenerPrice, class: 'form-control' %>          

    <%= f.submit "Sign Up!", class: "btn btn-primary" %>

  <% end %>

如果用户已注册课程,则显示此表单:

  <%= form_for course, :url => {:controller => "signups", :action => "show", params: {id: course.id}}, :method => "get" do |f| %> 

    <%= hidden_field_tag :course_id, course.id %>
    <%= hidden_field_tag :user_id, current_user.id %>

    <%= f.label :"Course Title" %>
    <%= f.text_field :courseTitle, class: 'form-control' %>

    <%= f.label :"Course Title" %>
    <%= f.text_field :courseTitle, class: 'form-control' %>

    <%= f.label :"Detailed Description Of Course Dates & Times" %>
    <%= f.text_area :courseDatesAndTimes, class: 'form-control' %>

    <%= f.label :"General Course Location eg 'Malaga'" %>
    <%= f.text_field :courseGeneralLocation, class: 'form-control' %>

    <%= f.label :"Exact Course Address including Postal Code" %>
    <%= f.text_field :courseExactAddress, class: 'form-control' %>

    <%= f.label :"Course Description" %>
    <%= f.text_area :courseDescription, class: 'form-control' %>

    <%= f.label :"Maximum Number of Students" %>
    <%= f.text_field :courseMaximumNumberStudents, class: 'form-control' %>

    <%= f.label :"Normal Course Price" %>
    <%= f.text_field :courseNormalPrice, class: 'form-control' %>

    <%= f.label :"'Listener' Course Price" %>
    <%= f.text_field :courseListenerPrice, class: 'form-control' %>


    <%= f.submit "You're Signed Up! View Details", class: "btn btn-primary" %>

  <% end %>

这不起作用 - 我收到错误:

CoursesController#index 中的 ActionController::UrlGenerationError 没有路线匹配 {:action=>"show", :controller=>"signups"}

显示操作位于 signups_controller 中(就在功能“创建”操作的下方),如下所示:

def show
  @courseID = params[:course_id]
  @userID = current_user.id
  @signup = getSignup(@courseID,@userID)
  redirect_to signups(@signup)
end

...在 routes.rb 文件中,我只有以下行:

resources :signups

我已尝试阅读有关路由的 rails 指南,以及有关如何调整选项以在不同控制器中正确调用不同操作的 form_for 指南,但我认为我在这里缺少一些基本知识不要让它在注册控制器中调用 show 操作,似乎是因为 routes.rb 问题。

谁能告诉我怎么了?

谢谢!

【问题讨论】:

  • params: {id: course.id}} 是不必要的,只需使用id: course.id
  • 还有 - 如果他们已经注册了,为什么还要显示表格...为什么不直接将他们重定向到课程?
  • 感谢您的意见!用户必须在课程开始之前完成某些准备任务,因此重要的是他们可以从课程列表中看到他们已注册的课程并能够进入并执行他们已经注册的课程前任务。
  • 是的,但为此,他们只需要课程展示页面......他们不需要查看“注册课程”表格。他们根本不需要看到这个表单,相反,“新”操作应该将他们直接重定向到显示页面
  • 用户需要能够去注册页面查看和编辑注册详细信息,不仅是在他们第一次注册时,而且在之后他们已经注册时。他们需要某种链接或按钮,因为当他们必须完成任务时,Web 应用不会为用户做出决定,由用户决定。

标签: ruby ruby-on-rails-4 routes form-for


【解决方案1】:

尝试替换

<%= form_for course, :url => {:controller => "signups", :action => "show", params: {id: course.id}}, :method => "get" do |f| %>

与

<%= form_for course, url: signup_path(course) do |f| %>

【讨论】:

  • 谢谢!我按照您的建议切换并收到错误消息:“参数丢失或值为空:注册”。但是错误表明正在发送补丁请求而不是我想要的获取请求,因此我添加了如下操作:' 'get' do |f| %>' 并且它确实调用了注册控制器中的显示操作。我真的很感激这个建议,但你能解释一下为什么这在原始 form_for 选项散列不起作用的情况下有效吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多