从另一个Rails中查看模型表单

时间:2014-03-10 21:23:55

标签: ruby-on-rails

我在rails工作,我有一个应用程序,我希望一个用户能够从他们的用户显示页面创建另一个模型的实例。

我有两个表,一个用于用户,一个用于汽车。 我有关系设置,因此一个用户has_many:cars,每辆车belongs_to:user

当用户第一次登录时,如果user.cars = 0,我希望页面显示在用户显示页面添加汽车的表单。

我正在使用迈克尔·哈特尔的教程,这很棒,我尝试在我的情况下使用微博模型工作,但我收到一个我无法弄清楚的错误。

这是我的show.html.erb:

    <p id="notice"><%= notice %></p>
<% provide(:title, @user.name) %>
<div class="userwrap">
  <div class="usershow">
    <div class="row">
      <section>
        <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
        </h1>
      </section>
    </div>
          <p>
            <%= image_tag @user.image.url(:medium) %>
          </p>
          <p>
            <strong>Name:</strong>
            <%= @user.name %>
          </p>

          <p>
            <strong>Email:</strong>
            <%= @user.email %>
          </p>
<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
</div>
  <div class="usercars">
      <%= render 'shared/carform' %>
  </div>
</div>

这是车型

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

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

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :nick %><br>
    <%= f.text_field :nick %>
  </div>
  <div class="field">
    <%= f.label :model %><br>
    <%= f.text_field :model %>
  </div>
  <div class="field">
    <%= f.label :make %><br>
    <%= f.text_field :make %>
  </div>
  <div class="field">
    <%= f.label :neighborhood %><br>
    <%= f.text_field :neighborhood %>
  </div>
  <div class="field">
    <%= f.label :year %><br>
    <%= f.number_field :year %>
  </div>

  <div class="field">
    <%= f.label :picture %><br>
    <%= f.text_field :picture %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

这是我的控制器节目

def show
@user = User.find(params[:id])
@cars = @user.cars
end

我得到的错误是

First argument in form cannot contain nil or be empty

我想我在这个问题上已经被困了太久了。在森林里太深看树了。我相信它相对简单。汽车控制器是否应该在用户视图中处理此问题?如果是这样,我该怎么做呢?

希望我很清楚。如果你需要看其他任何东西,我很乐意发布它。谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

我应该指出两件事

  1. 你的@car对象是空的,因此它正如它所说的那样,形式中的第一个参数不能包含nil或为空,因为你要将@car发送到一个form_for,它要求@car初始化,而不是初始化在用户控制器的show动作中。
  2. Partials无权访问控制器中的实例变量。因此,即使您的用户控制器的show动作中初始化了您的@car变量,也不能在部分中使用@car,而是需要在show视图页面中从render函数传递它。 (见:Pass a variable into a partial, rails 3?
  3. 基本上在你的控制器中你需要像

    这样的东西
    def show
        stuff here
        @car = Car.new
    end
    

    渲染表单应该类似于

    <%= render 'shared/carform', :car => @car %>
    

    您需要像这样创建表单

    <%= form_for(car) %>
    

    <%= form_for(@car) %>
    

    根据表单处理的位置,您可能需要或不需要向form_for函数添加其他参数。

答案 1 :(得分:0)

为什么不重定向用户编辑车页?喜欢以下方式:

def show
  @user = User.find(params[:id])
  @cars = @user.cars
  redirect_to edit_car_path and return if @cars.count == 0
end