我已经完成了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请求并发送到正确的路由