Rails 4:使用URL中的param预填充表单

时间:2015-11-19 18:19:08

标签: ruby-on-rails forms ruby-on-rails-4 parameter-passing

在我的Rails 4应用中,我有一个Calendar和一个Post模型,使用shallow routes

resources :calendars do
  resources :posts, shallow: true
end

日历has_many帖子和帖子belong_to日历。

通过Posts#New视图创建新的帖子对象,格式如下:

<%= form_for [@calendar, @calendar.posts.build], html: { multipart: true } do |f| %>

  <div class="field">
    <%= f.label :date, "DATE & TIME" %>
    <%= f.datetime_select :date %>
  </div>

  [...] # Truncated for brivety

  <div class="actions">
    <%= f.submit @post.new_record? ? "CREATE POST" : "UPDATE POST", :id => :post_submit %>
  </div>

<% end %>

在某些情况下 - 但不是全部 - 我希望使用通过URL传递的参数预填充表单的日期字段。

我已通过以下链接在URL中传递日期:

<%= link_to '<i class="glyphicon glyphicon-plus-sign"></i>'.html_safe, new_calendar_post_path(@calendar, date: date) %>

此链接为我提供了以下类型的网址:

http://localhost:3000/calendars/6/posts/new?date=2015-11-12

从那里,我如何预填表格?

最重要的是,当通过网址传递日期时,如何

2 个答案:

答案 0 :(得分:3)

您应该在new操作

上的Post控制器中预填充新的Post数据
class PostsController << ApplicationController
  ...
  def new
    if (date = params['date']).present?
      @post = @calendar.posts.build(date: date)
    else
      @post = @calendar.posts.build
    end
  end
  ...
end

在你看来

<%= form_for [@calendar, @post], html: { multipart: true } do |f| %>

  <div class="field">
    <%= f.label :date, "DATE & TIME" %>
    <%= f.datetime_select :date %>
  </div>

  [...] # Truncated for brivety

  <div class="actions">
    <%= f.submit @post.new_record? ? "CREATE POST" : "UPDATE POST", :id => :post_submit %>
  </div>

<% end %>

答案 1 :(得分:1)

偏离主题:您可能希望使用link_to的块语法而不是使用html_safe?

<%= link_to new_calendar_post_path(@calendar, date: date) do %>
  <i class="glyphicon glyphicon-plus-sign"></i>
<% end %>