【问题标题】:Passing id to form_with in rails在rails中将id传递给form_with
【发布时间】:2020-08-26 20:00:28
【问题描述】:

对于一个大学小组项目,我们正在创建一个 Rails 应用程序,可以在其中创建、访问等 Uni 课程。

“课程协调员必须能够将用户设置为给定课程的标记”项目的要求之一。为了解决这个问题,有一个角色表,其中存储了 user_id、course_id 和角色,在本例中为“Marker”。

我创建了一个视图,课程协调员可以在其中从所有用户中选择一个用户并将其设置为标记。这发生在课程/assign_marker 页面上。该页面的控制器方法如下所示:

def assign_marker
    @users = User.enrolled_users
    @course = Course.find(params[:id])
end

这里,enrolled_users 只返回所有不是管理员的用户(这可行),params[:id] 是 course_id。如果我使用 puts,我可以看到它具有正确的值,所以一切正常。

我的问题出现在我处理发布请求的函数中:

def add_marker

    Role.assign_marker(params[:user_id], params[:id])           

    # Flash
    flash[:notice] = "#{User.find(params[:user_id]).username} was assigned as Marker to #{Course.find(params[:id]).courseName}"

    # Refresh
    redirect_back(fallback_location: root_path)

end

提交表单后,我发现 add_marker 将 params[:id] 视为空白。下面是我的haml形式(对应assign_marker函数)

= form_with url: 'assign_marker', :id => "#{@course.id}" do |f|
  .row
    .input-field

      -# Display username in selection & store id as parameter
      = f.collection_select(:user_id, @users, :id, :username, :include_blank => true)

      %label Users

 = button_tag "Set as Marker", {:class => "waves-effect waves-light btn"} 

如果我将 #{@course.id} 放置在视图中的任何位置,我可以看到正确的 course_id 显示。我试图在 form_with 中设置 id,如上所示,因为这就是我对 form_tag 所做的。显然这不起作用,并且 add_marker 没有通过 params[:id] 看到它。

另外,我上面的 get 和 post 请求的路由如下:

get 'courses/assign_marker', :to => 'courses#assign_marker'
post 'courses/assign_marker', :to => 'courses#add_marker'

我对 Rails 还很陌生,所以我可能遗漏了一些非常明显的东西。任何帮助将非常感激 :)。谢谢

【问题讨论】:

    标签: ruby-on-rails ruby haml


    【解决方案1】:

    :id => "#{@course.id}" 不起作用的原因是因为它只是用于设置 HTML id 属性,您可以查看更多关于 here 的信息

    最好的解决方案是使用嵌套路由。假设您在 config/routes.rb 某处有 resources :courses,您可以这样声明:

    resources :courses do
      member do
        get :assign_marker
        post :add_marker
      end
    end
    

    这将生成以下路线:

    GET  /courses/:id/assign_marker
    POST /courses/:id/add_marker
    

    然后您可以像这样引用它们的路径:

    assign_marker_course(@course)
    add_marker_course(@course)
    

    另一种解决方案,听起来可能更简单,但并不是真正的“Rails 方式”,就是将 id 添加为隐藏字段,如下所示:

    = f.hidden_field :id, value: @course.id
    

    【讨论】:

    • 非常感谢!从现在开始,我一定会利用路线中的资源:)
    • 考虑使用更 RESTful 的方法:将 resources :markers 嵌套在 resources :courses 下,然后使用标准操作、路由等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多