我是否正确处理此Rails表单?

时间:2011-10-28 21:06:54

标签: ruby ruby-on-rails-3 forms views controllers

在我的relations_controller中,我有以下内容:

class RelationshipsController < ApplicationController

  def new
    @user_id = User.find_by_id(params[:user_id])
    @relationship = Relationship.new
  end

  def create
    @relationship = Relationship.new(params[:relationship])
    @relationship.rel_id = User.find_by_id(params[:user_id])
    @relationship.user_id = current_user
    if @relationship.save
        redirect_to root_url, :notice => "Signed Up!"
    else
        render "new"
    end
  end
end

在我看来,我有:

<section id="main">
  <%= form_for [@user_id, @relationship]  do |f| %>
    <div class="field">
      <%= f.label :type %>
      <%= select_tag(:type, options_for_select([['Friend', 0], ['Family', 1],['Spouse', 2]])) %>
    </div>
   <div class="actions"><%= f.submit %></div>
  <% end %>
</section>

我有几个问题:

  1. 这是处理rel_id和user_id的正确方法吗?对我来说似乎有点笨拙。

  2. 我无法获取:type保存到数据库,但其他一切都是。我在服务器日志中找到以下内容:

  3. Parameters: {"utf8"=>"✓", "authenticity_token"=>"z7R4tWSSVHZmFXfh8HocfyuegZ2rwuXXeTLKbR+cLfs=", "type"=>"0", "commit"=>"Create Relationship", "user_id"=>"7"}

    这对我来说很奇怪,因为它应该是保存类型。

    3 ..如果我在<%= form_for [@user_id, @relationship] do |f| %>行使用@user_id或@current用户,这有关系吗?为什么呢?

2 个答案:

答案 0 :(得分:1)

1)@user_id实际上已分配了User的实例,因此我将其称为@user 在分配rel_id时,我认为您只需要用户ID值(整数)。您可以这样做:

@relationship.rel_id = params[:user_id]

2)type字段用于带有ActiveRecord的STI表,如果您因任何其他原因命名字段type,则会发生错误。尝试将其更改为其他名称,例如relationship_type

3)可能,具体取决于您的应用的设置方式。 @user(_id)和@current_user可能代表不同的用户。如果您只希望当前用户为自己创建关系,那么您可以使用@current_user(在这种情况下可能不使用嵌套路由)。

答案 1 :(得分:1)

调用属性“type”在rails中是禁止的,因为它已经在类上定义了从ActiveRecord :: Base继承的类型方法。它用于单表继承。

最不痛苦的事情是将该列重命名为“relationship_type”或“kind”,但如果您确实需要,可以像这样绕过它:

@relationship = Relationship.new(params[:relationship])
@relationship[:type] = params[:type]