无法通过create action将行插入表中

时间:2011-05-17 12:05:10

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

我确信我的问题必须有一个非常简单的解决方案,但我不知道为什么我似乎无法把手指放在上面,问题是我每次都试图提交表格我提交表单,创建操作控制器给出以下错误

  

Mysql2 ::错误:列'preffered_players'不能为空:INSERT INTO saved_sessionspreffered_playerssession_idpreffered_opponentsgame_id,{{ 1}},game_typeopponents_listbanned_players)VALUES(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)

如果表单提交后,错误所说的所有这些值都是null,那么任何人都可以告诉我如何使用从表单中获取的参数值来填充我的小空值查询,创建控制器如下

players_list

感谢任何建议......

我包括表单代码但是它非常混乱(它是一个巨大的形式)加上它的haml:)

def create
    opponents_list = params[:opponents_list]
    banned_players = params[:banned_players]
    game_type = params[:game_type]
    session_id = params[:session_id]
    preffered_opponents = params[:preffered_opponents]
    game_id = params[:game_id]
    players_list = params[:players_list]
    preffered_players = params[:preffered_players]

    @saved_sessions = SavedSession.new(params[:saved_sessions])

    respond_to do |format|
      if @saved_sessions.save
        format.html { redirect_to(@game, :notice => 'Game was successfully created.') }
        format.xml  { render :xml => @game, :status => :created, :location => @game }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @game.errors, :status => :unprocessable_entity }
      end
    end
  end 
希望这可以帮助你们更好地理解这个问题。

1 个答案:

答案 0 :(得分:1)

你似乎是从两个不同的地方拉。方法顶部的代码块从传入参数的顶层提取值,但稍后使用params [:saved_sessions]输入初始化新的SavedSession。这两件事似乎不匹配......

如果在第一行的opponents_list = params [:opponents_list]中找到saved_sessions.opponents_list,那么当你以后尝试保存params [:saved_sessions]时,你会从params中的另一个地方获取它...

编辑:所以你不需要你在动作中拥有的两组值。如果你像这样构建你的表单(或者至少是这样的东西)你可以正确地得到params并且可以盲目地将它们发送到SavedSession.new,然后调用.save。

- form_for(@aved_session) do |f| 
  -.blue_col
      = f.text_field :preffered_opponents, "", :class => :blue_bar

如果你允许f.text_field构建id和name,那么rails magic将确保它们被正确命名/ id,然后更多rails magic解释它们并正确构建你的输入参数。这将构建您的参数:

params = {:saved_session => {:preferred_opponents => "text value" }...

然后你可以把那些参数拉出来:

saved_session_input = params[:saved_session]

并将它们传递给新的就像你一样。不同的是,现在这些参数实际上是IN。

你拥有它的方式是这样的:

params = {:preferred_opponents => "text value", :saved_session => {:preferred_opponents => nil }...

这意味着您将nil传递给new的预期值。请注意,在调用save之前,您实际上并未将本地值分配给新的saved_session。

我希望这更清楚。