在 rails 中将 id 传递给 form_with

Passing id to form_with in rails

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

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

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

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

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

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

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 的新手,所以我可能遗漏了一些非常明显的东西。任何帮助将非常感激 :)。谢谢

: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