在轨道上的红宝石中使用表单助手的问题

时间:2014-11-14 22:10:39

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 form-helpers

我有一个具有以下属性的类活动:

String type, Date date, String title

通过添加关联,它还包含 user_id place_id

class Activity < ActiveRecord::Base
   belongs_to :user
   belongs_to :place

另一方面用户有很多活动地方有很多活动

所以,问题是我想要创建一个新活动: Scaffold创建帮助 _form

<%= form_for(@activity) do |f| %>
  <% if @activity.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@activity.errors.count, "error") %> prohibited this activity from being saved:</h2>

      <ul>
      <% @activity.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :type %><br>
    <%= f.text_field :type %>
  </div>
  <div class="field">
    <%= f.label :date %><br>
    <%= f.datetime_select :date %>
  </div>
  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :user_id %><br>
    <%= f.number_field :user_id %>
  </div>
  <div class="field">
    <%= f.label :place_id %><br>
    <%= f.number_field :place_id %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我希望从表单(类型,日期和标题)中收到前3个字段,但要关联用户和我必须以其他方式执行的地方。我需要实际登录的用户,并通过提示名称来选择地点。

我的想法是:

1)用户问题,我可以使用我访问的current_logged_user进行查询并获取其ID。

2)这个地方问题,我可以使用从表单收到的名称,并查询名为X的地方的Places表格,然后获取ID。

但是,因为我对rails不太了解,我怎么能这样做呢?我如何使用f.text_field然后在控制器中进行查询或其他任何操作?

控制器已经有了这个东西:

def create
    @activity = Activity.new(activity_params)
(...)

private
    # Use callbacks to share common setup or constraints between actions.
    def set_activity
      @activity = Activity.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def activity_params
      params.require(:activity).permit(:type, :date, :title, :user_id, :place_id)
    end

1 个答案:

答案 0 :(得分:1)

您可以构建rails应用程序,以便直接从表单中获取user_id和place_id。特别是从提交的表单中获取user_id通常不是一个好主意。您通常不希望将user_id列入白名单。

user_id

如果您使用类似设计的宝石进行用户身份验证,则可以访问名为current_user的方法,您可以使用该方法设置user_id。

place_id

我建议将活动作为地方的子路线。例如而不是在<host>/activities/new下面的表格,把它放在``/ places /:place_id / activities / new`下。在您的路线文件中,路线如下:

resources :places do
    resources :activities
end

现在,在您的控制器操作中,您可以执行以下操作:

def create
    @activity = current_user.activities.new(activity_params)
    @activity.place_id = params[:place_id] (or even safer will be @activity.place = Place.find(params[:place_id], but this will require one more sql query ) 
    (...)
private      

# Never trust parameters from the scary internet, only allow the white list through.
def activity_params
  params.require(:activity).permit(:type, :date, :title)
end

<强>更新

如果您绝对想要在/ activities / new route下使用该表单,那么您可以在表单中为place_id选择一个标记:

select_tag 'activity[place_id]', options_from_collection_for_select(Place.all, 'id', 'name')

这将创建一个名称为&#39; activity [place_id]&#39; (以params.require(:activity).permit(place_id)的方式命名,以及类似

的选项
<option value="1">Barcelona</option>