Rails:link_to参数

时间:2013-12-05 14:35:00

标签: ruby-on-rails rails-routing link-to constraintexception

我对Rails是全新的,并且仍然存在从ListaUsuarios视图通过此链接发送参数的问题,尽管现在尝试和研究了很多小时:

<%= link_to "Agregar", @solicitud_contacto, method: :post %>

由于我已经设置了

,它会按预期进入创建操作
resources :solicitud_contactos
在routes.rb中

。但是我收到以下错误:

ActiveRecord::StatementInvalid in SolicitudContactosController#create

SQLite3::ConstraintException: solicitud_contactos.solicitante_id may not be NULL: INSERT INTO "solicitud_contactos" ("created_at", "solicitado_id", "solicitante_id", "updated_at") VALUES (?, ?, ?, ?)

只是为了解释,因为问题出现了:SolicitudContacto应该是添加另一个用户的需求(“友谊”或“联系”需求),以便第二个用户可以接受或拒绝需求。所以我只想在有人点击链接时在数据库中保存这样的需求。 “Usuario”(“SolicitudContacto”模型中的属性类型)仅表示“用户”。

另外,我得到它的方式,以下链接应该得到相同的结果:

<%= link_to "Agregar", solicitud_contacto_path(@solicitud_contacto), method: :post %>

但它给我一个不同的错误。显然,这里会传输ID,但链接会转到show动作。

Routing Error

No route matches {:action=>"show", :controller=>"solicitud_contactos", :id=>#<SolicitudContacto id: nil, solicitante_id: 2, solicitado_id: 4, created_at: nil, updated_at: nil>}

我在

中遇到了同样的问题
<%= link_to "Rechazar", @solicitud_contacto, :method => :delete %>

在同一视图中。

编辑:感谢Baldricks评论至少删除链接现在有效,我不记得我必须使用数据库中的实际对象。因此,通过以下方法替换相应的if块:

  <% if (index = @solicitantes.index { |solic| solic.solicitante.id == usuario.id }) != nil %>
    <%= link_to "Rechazar", @solicitantes[index], :method => :delete %>

@solicitud_contacto对象,带有

的相应ID

@ solicitud_contacto.solicitante.id   @ solicitud_contacto.solicitado.id

肯定是设置的,因为我将它们打印在相同的视图中进行测试。我希望有人可以帮助我,因为这确实令人沮丧...非常感谢!

P.S:

我也读过这个:

<%= javascript_include_tag "application" %>

应该在application.html.erb中设置。它是!

以下是相关代码:

SolicitudContacto模型

class SolicitudContacto < ActiveRecord::Base
  attr_accessible :solicitado_id, :solicitante_id
  belongs_to :solicitado, class_name: "Usuario"
  belongs_to :solicitante, class_name: "Usuario"
end

SolicitudContacto Controller

class SolicitudContactosController < ApplicationController
  def create
    @solicitud = SolicitudContacto.new(params[:solicitud_contacto])
    @solicitud.save
    redirect_to :controller => SearchUsersController, :action => BusquedaUsuarios
  end

  def destroy
    @solicitud = SolicitudContacto.find(params[:id])
    @solicitud.destroy
    redirect_to :controller => SearchUsersController, :action => BusquedaUsuarios
  end

  def index
    @solicitudes = SolicitudContacto.all
  end

  def new
  end

  def show
    @solicitud = SolicitudContacto.find(params[:id])
  end
end

SearchUsersController

class SearchUsersController < ApplicationController

  def BusquedaUsuarios
    @usuario = Usuario.new
  end

  def ListaUsuarios
    # DELETE!!!!!
    $current_usuario = Usuario.find(2)

    @cur_usuario = $current_usuario;
    @solicitud_contacto = SolicitudContacto.new
    @usuario = Usuario.new(params[:usuario])
    @filtros = Hash.new(0);
    if @usuario.nombre != ""
    @filtros["nombre"] = @usuario.nombre
    end
    if @usuario.apellido != ""
    @filtros["apellido"] = @usuario.apellido
    end
    if @usuario.email != ""
    @filtros["email"] = @usuario.email
    end
    @solicitados = @cur_usuario.solicitantes
    @solicitantes = @cur_usuario.solicitados
    @contactos = @cur_usuario.user1s + @cur_usuario.user2s
    @usuarios = Usuario.where(@filtros).order(:nombre).all
  end
end

ListaUsuarios(SearchUsersController的用户列表视图)

<h1>SearchUsers#ListaUsuarios</h1>
<p>Find me in app/views/search_users/ListaUsuarios.html.erb</p>

<table>
  <tr>
    <th>Nombre</th>
    <th>Apellido</th>
    <th>Email</th>
    <th></th>
  </tr>

  <% @usuarios.each do |usuario| %>
    <tr>
      <td><%= usuario.nombre %></td>
      <td><%= usuario.apellido %></td>
      <td><%= usuario.email %></td>
      <td>
      <% @solicitud_contacto.solicitante = @cur_usuario %>
      <% @solicitud_contacto.solicitado = usuario %>
    <br>
      <%= @solicitud_contacto.solicitante.id %>
      <%= @solicitud_contacto.solicitado.id %>
    <br>
      <!-- responder la solicitud -->
      <% if @solicitantes.index { |solic| solic.solicitante.id == usuario.id } != nil %>
        <%= link_to "Rechazar", @solicitud_contacto, :method => :delete %>
      <!-- solicitud ya fue mandada -->
      <% elsif @solicitados.index { |solic| solic.solicitado.id == usuario.id } != nil %>
        Esperando Respuesta
      <!-- solicitar contacto -->
      <% else %>
        <%= link_to "Agregar", @solicitud_contacto, method: :post %>
      <% end %>
      </td>
    </tr>
  <% end %>
</table>

1 个答案:

答案 0 :(得分:0)

创建显示或删除操作的链接时,必须使用持久对象(即对象是在数据库中创建了ID的对象)。在您正在执行的控制器中

@solicitud_contacto = SolicitudContacto.new

对象已实例化,但未在数据库中创建(您必须为此调用savecreate)。它没有身份证。

如何解决您的问题?我不确定,我不明白你想要实现的目标。我认为目标链接是错误的,应该是@solicitud_contacto.solicitante

<% if @solicitantes.any? { |solic| solic.id == usuario.id }  %>
    <%= link_to "Rechazar", @solicitud_contacto.solicitante, :method => :delete %>
...