从form_for获取价值

时间:2013-12-30 09:22:02

标签: ruby-on-rails devise ruby-on-rails-4 form-for

我正在使用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正确或其他什么?

2 个答案:

答案 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”属性的值,否则这是默认行为。

希望有所帮助!