我有一个具有以下属性的类活动:
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
答案 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>