【问题标题】:View Model Form From Within Another Rails从另一个 Rails 中查看模型表单
【发布时间】:2014-03-11 05:58:59
【问题描述】:

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

我有两张桌子,一张给用户,一张给汽车。 我设置了关系,所以一个用户 has_many :cars,每辆车都属于_to :user

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

我正在使用 Michael Hartl 的教程,这很棒,我尝试在我的情况下使用 micropost 模型工作,但我遇到了一个我无法弄清楚的错误。

这是我的 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

我想我在这个问题上已经被难住了太久了。森林太深,看不到树木。我敢肯定它相对简单。汽车控制器是否应该在用户视图中处理这个问题?如果是这样,我该如何实现?

希望我是清楚的。如果您需要查看其他内容,我很乐意发布。感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    有两点需要说明

    1. 您的@car 对象是空的,因此正如它所说的那样,form 中的第一个参数不能包含 nil 或为空,因为您将@car 发送到一个 form_for,它期望 @car 被初始化,它没有被初始化在用户控制器的显示操作中。
    2. Partials 无权访问控制器中的实例变量。因此,即使您的 @car 变量在用户控制器的显示操作中初始化,您也不能在部分中使用 @car,而是需要从显示视图页面中的渲染函数传递它。 (参见:Pass a variable into a partial, rails 3?

    基本上在你的控制器中你需要有类似的东西

    def show
        stuff here
        @car = Car.new
    end
    

    渲染表单应该类似于

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

    你需要像这样创建你的表单

    <%= form_for(car) %>
    

    <%= form_for(@car) %>
    

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

    【讨论】:

    • 除了form_for还有其他的发送方式吗?
    • 或者我应该在我的用户控制器中初始化它吗?哪个是首选?
    • 另外 - 我有一部分来自使用 @user.errors.any 的 Michael Hartl 教程?那不是实例变量吗?
    • 是的,你应该在你的控制器中初始化@car,你还需要传递它。
    • @Peege151 要么你读错了教程,要么教程本身就错了,因为据我所知
    【解决方案2】:

    为什么不将用户重定向到编辑汽车页面?像下面这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-21
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多