我正在使用rails 4.0.1
<%= form_for @event, :html => { :multipart => true} do |f| %>
<div class="field">
<%= f.label :title %><br>
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :content %><br>
<%= f.text_area :content %>
</div>
<div class="field">
<%= f.label :place_id %><br>
<%= f.collection_select(:place_id, @places, :id, :title) %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我想检查current_user.id和Place.user_id(它存储创建者ID)。在事件cotroller我试图使用:
def create
@places = Place.all
@event = Event.new(event_params)
@event.user_id = current_user.id
@curplace = Place.find_by(id: params[:place_id])
@event.content = @curplace.id
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render action: 'show', status: :created, location: @event }
else
format.html { render action: 'new' }
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
end
但是我收到了一个错误。我想我没有得到这个Place_id param正确或其他什么?
答案 0 :(得分:4)
除了Ankush Kataria的评论之外,form_for
助手基本上创建了一个表格,它将所有参数组合成一个哈希值,而不是form_tag
,它只是单独使用参数
正如您所发现的,这意味着您的参数将通过以下方式访问:
#form_for
params[:variable][:param]
#form_tag
params[:param]
<强>的form_for 强>
这一点很重要的原因是,如果您使用RESTful
路线界面,则可以create
/ edit
/ update
种类记录
form_for
基本上保持整个过程的一致性,使用各种值预先填充表单,并保持代码干净
要调用form_for
帮助程序,您必须定义填充表单的@varaible
。此@variable
必须是ActiveRecord
对象,这就是您必须在表单显示之前在new
操作中构建它的原因
<强>的form_tag 强>
form_tag
更加独立于form_for
助手,不需要任何@variable
,并且单独创建参数
您使用form_tag
表示contact us
表单或类似内容
您的代码
您的表单看起来不错,但您的create
操作可能会枯竭:
def create
@places = Place.all
@event = Event.new(event_params)
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
format.json { render action: 'show', status: :created, location: @event }
else
format.html { render action: 'new' }
format.json { render json: @event.errors, status: :unprocessable_entity }
end
end
end
private
def event_params
params.require(:event).permit(:title, :content).merge(user_id: current_user.id, place_id: params[:event][:place_id])
end
答案 1 :(得分:1)
你说得对,params [:place_id]没有返回你期望的值。它只返回零。要获取表单提交的:place_id,您必须执行以下操作:
@curplace = Place.find(params[:event][:place_id])
只需用上面的代码替换旧行。这是因为您使用Rails提供的form_for帮助方法,因为您的表单在params哈希中的:event键内的字段中提交数据。除非您在输入字段中更改“name”属性的值,否则这是默认行为。
希望有所帮助!