在Rails中将id传递给form_with

问题描述

对于一个大学团体项目,我们正在创建一个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。如果使用看跌期权,我可以看到它具有正确的值,因此一切正常。

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

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的更多信息

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

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

这将产生以下路线:

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

然后您可以像这样引用其路径:

assign_market_course(@course)
add_market_course(@course)

另一种解决方案,听起来似乎更简单,但这并不是“ Rails方式”,实际上是将id添加为隐藏字段,如下所示:

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...