Rails提交创建操作成功

时间:2015-06-09 12:35:08

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

我正在学习ruby rails,我有一个#create问题(我认为)

当我用form_for创建一个新的“stat”时,一旦按下提交,我就会重定向到index.html.erb(如我的控制器中所写)但除了id之外没有数据(即使我选择了我的自我一个id,它由rails生成)

奇怪的部分是,如果我编辑新条目(其中一切都是空白但是:ID)数据被保存。

我希望我很清楚这是我关于stackoverflow的第一个问题

很多!

我的控制器:统计

def new
    @stat = Stat.new
end 

def create
    @stat = Stat.new
    if @stat.save 
      redirect_to "/stats" 
      flash[:notice] = "work"
    else 
      render "new"
      flash[:notice] = "didn't work"
    end 
end 

创建操作的日志

tarted POST "/stats" for 92.133.16.18 at 2015-06-09 12:09:11 +0000
Processing by StatsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"bCV+ymN4NxuMM6441OLaRyu/cuLXIcX5fu1g/rG+gqg=", "stat"=>{"id"=>"", "cc"=>"ok", "ct"=>"ok", "force"=>"ok", "endurance"=>"ok", "blessure"=>"ok", "init"=>"ok", "attaque"=>"ok", "ld"=>"ok", "sv"=>"ok"}, "commit"=>"Save"}
   (0.1ms)  begin transaction
  SQL (0.3ms)  INSERT INTO "stats" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2015-06-09 12:09:11.561787"], ["updated_at", "2015-06-09 12:09:11.561787"]]
   (10.8ms)  commit transaction
Redirected to https://codex-bobix.c9.io/stats
Completed 302 Found in 16ms (ActiveRecord: 11.2ms)

更新操作的日志

Started PATCH "/stats/11" for 92.133.16.18 at 2015-06-09 12:04:09 +0000
Processing by StatsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"bCV+ymN4NxuMM6441OLaRyu/cuLXIcX5fu1g/rG+gqg=", "stat"=>{"id"=>"11", "statname"=>"tt", "cc"=>"tt", "ct"=>"t", "force"=>"ttt", "endurance"=>"tt", "blessure"=>"t", "init"=>"ttt", "attaque"=>"tt", "ld"=>"ttt", "sv"=>"tt"}, "commit"=>"save", "id"=>"11"}
  Stat Load (0.2ms)  SELECT  "stats".* FROM "stats"  WHERE "stats"."id" = ? LIMIT 1  [["id", 11]]
   (0.1ms)  begin transaction
  SQL (0.5ms)  UPDATE "stats" SET "attaque" = ?, "blessure" = ?, "cc" = ?, "ct" = ?, "endurance" = ?, "force" = ?, "init" = ?, "ld" = ?, "statname" = ?, "sv" = ?, "updated_at" = ? WHERE "stats"."id" = 11  [["attaque", "tt"], ["blessure", "t"], ["cc", "tt"], ["ct", "t"], ["endurance", "tt"], ["force", "ttt"], ["init", "ttt"], ["ld", "ttt"], ["statname", "tt"], ["sv", "tt"], ["updated_at", "2015-06-09 12:04:09.051306"]]
   (15.9ms)  commit transaction
Redirected to https://codex-bobix.c9.io/stats
Completed 302 Found in 25ms (ActiveRecord: 16.8ms)

class StatsController < ApplicationController
  def index
    @stats = Stat.all
  end 

  def show
    @stat = Stat.find(params[:id])
    @units = @stat.units
  end

  def new
    @stat = Stat.new
  end

  def edit 
    @stat = Stat.find(params[:id])
  end

  def update 
    @stat = Stat.find(params[:id])
    @stat.update(stat_params)
    redirect_to "/stats"
    flash[:notice] = "work"
  end

  def new
    @stat = Stat.new
  end 

  def create
    @stat = Stat.new
    if @stat.save 
      redirect_to "/stats" 
      flash[:notice] = "work"
    else 
      render "new"
      flash[:notice] = "didn't work"
    end 
  end 



    private

    def stat_params
        params.require(:stat).permit(:cc, :ct, :force, :endurance, :blessure, :init, :attaque, :ld, :sv, :id, :statname)
    end



end

2 个答案:

答案 0 :(得分:1)

在您的create行动中,您没有为Stat传递任何论据,它应该是这样的:

class StatsController < ApplicationController
  def create
    @stat = Stat.new stat_params
    # ...
  end

  private

  def stat_params
    params.require(:stat).permit(:id, :cc, :ct, :force, :endurance, :blessure, :init, :attaque, :ld, :sv)
  end
end

希望有所帮助!

答案 1 :(得分:1)

当您说@stat = Stat.new时,您将实例化一个没有指定属性的新Stat对象,然后保存它。因此,无论您传递给控制器​​的参数是什么,您将只拥有自动生成的字段(在本例中为ID)。您需要做的是获取参数并从中创建一个新对象(即@stat = Stat.new( stat_params ))。

由于您在控制器底部定义了stat_params方法(通常在生成脚手架时默认为这种情况),因此仅使用该行代码就可以解决问题。基本上你需要做的就是抓住stat的params(从new提交),把它们变成一个哈希,并把它们放到Stat.new( ... )语句中。