新的Rails尝试传递月份和年份从一个表单到一个url



我已经完成了Hartl的Rails教程,现在正在做一个使用simple_calendar gem的项目。

我想添加一个下拉菜单,让用户可以快速导航到特定的月份和年份,而不必点击"下一个"。链接多次

到目前为止,我已经设法创建下拉表单,但我不知道如何设置控制器,以获得url与表单参数提交。

这是我创建的在monthview日历顶部呈现的部分:

<%= form_with do |form|  %>
<%= select_month( Time.now, {:field_name => 'month', :id => 'month'} ) %>
<%= select_year( Date.today, {:start_year => Time.now.year,:end_year => Time.now.year+3} ,{:field_name => 'year', :id => 'year'} ) %>
<%= submit_tag("Go", :id=>"button", :class=>"date-button", :name=>"submit") %>
<% end %>

谁能解释一下我如何编写控制器代码来传递这些参数,以便用户转到像https://mycalendar.com/calendar?year=2021&month=june

这样的链接谢谢你的帮助。

可以直接读取参数

<%= form_with do |form|  %>
<%= select_month( params[:month].present? ? Date.strptime(params[:month], '%B') : Time.now, {:field_name => 'month', :id => 'month'} ) %>
<%= select_year( params[:year].present? ? Date.strptime(params[:year], '%y') : Date.today, {:start_year => Time.now.year,:end_year => Time.now.year+3} ,{:field_name => 'year', :id => 'year'} ) %>
<%= submit_tag("Go", :id=>"button", :class=>"date-button", :name=>"submit") %>
<% end %>

但是您必须添加对无效日期/参数的检查,因此最好在控制器端进行解析

可以抓取通过params[:parameter]发送到控制器的参数。这适用于GET和POST请求。在GET请求中,这些参数是通过url传递的。/calendar?year=2021&month=june,而在POST请求中,它们是在formBody对象中传递的。

在Rails中最好的事情之一就是在发出请求时查看控制台。它会告诉你日志中的路由、控制器、动作和参数。

对于GET请求,可以使用下面的方法来获取参数。

# controller
def calendar
year = params[:year]
month = params[:month]
end
一般来说,表单将通过PUT(创建)或PATCH(更新)请求(一起称为POST)发送。在这种情况下,您可能有一个存储表单字段的模型对象,并且您将通过清理过程获取参数。这种清理对于确保恶意代码不被传递到数据库非常重要。
def create
@event = Event.new(event_params)
...
end
private
def event_params
params.require(:event).permit(:month, :year, :title)
end

您的form_with可能需要一个url: '/calendar'甚至method: :get来将其转换为GET请求并发送到正确的路由

最新更新