使用simple_form,如何以DRY方式在另一个控制器的视图上呈现“新”表单?

时间:2013-03-09 23:26:00

标签: ruby-on-rails ruby-on-rails-3 simple-form

对于我的_form.html.erb模型,我有一个DailyEntry部分,如下所示:

<%= simple_form_for(@daily_entry) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :breakfast %>
    <%= f.input :snack_1 %>
    <%= f.input :lunch %>
    <%= f.input :snack_2 %>
    <%= f.input :dinner %>
    <%= f.input :water_intake %>
    <%= f.input :workout %>
    <%= f.input :notes %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

每个DailyEntry属于User ...即。每个daily_entry记录都有一个user_id列。

我希望current_user能够在daily_entry页面中添加Home#Index - 不会重复我create控制器的DailyEntry操作

那么如何一石二鸟?即将新创建的daily_entry记录分配给当前用户,然后从我的views/home/index.html.erb完成所有操作?

修改1

我知道如何将每条记录分配给用户....在DailyEntry控制器create操作中,我有:

def create
  @daily_entry = current_user.daily_entries.create(params[:daily_entry])

respond_to do |format|
  if @daily_entry.save
    format.html { redirect_to @daily_entry, notice: 'Daily entry was successfully created.' }
    format.json { render json: @daily_entry, status: :created, location: @daily_entry }
  else
    format.html { render action: "new" }
    format.json { render json: @daily_entry.errors, status: :unprocessable_entity }
  end
 end
end

我只是不确定如何从Home#Index.html.erb完成此操作。如何在不复制HomeController中的控制器逻辑的情况下呈现此表单?

修改2

我也试过这个:

<%= render partial: "daily_entries/form", @daily_entry => current_user.daily_entries.build  %>

但我仍然会收到此错误:

NoMethodError at /
undefined method `model_name' for NilClass:Class

在线:

<%= simple_form_for(@daily_entry) do |f| %>

1 个答案:

答案 0 :(得分:2)

您的daily_entries控制器上的create操作是您的表单操作指向的位置,而且不会发生变化。

要在索引页面上呈现表单,您所要做的就是在home_controller中构建@daily_entry对象:

# home_controller.rb
def index
    @daily_entry = DailyEntry.new
end

# home/index.html.erb
<%= render "daily_entries/form" %>