Rails - 不保存check_box_tag的方法

时间:2015-10-25 01:15:38

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

我在tmdb api上继续我的项目,并在保存查询结果的过程中。我创建了方法add_tmdb来处理这个问题。至于我的看法,这就是我所拥有的:

= form_tag :action => 'add_tmdb' do
  ... stuff here
   %td= check_box_tag "movie_id[]", movie.id
 = submit_tag 'Add selected movie'

我的controller位于以下位置:

def add_tmdb
    movie = {params[:movie_id] => :id}
    Movie.create!(movie)
    flash[:notice] = "#{params[:movie_id]} was successfully created."
    redirect_to movies_path
end

当我提交记录时,我收到一条活动记录错误。这是我收到的:

unknown attribute '["7555"]' for Movie.

我需要在哪里进行更改?

谢谢!

2 个答案:

答案 0 :(得分:2)

params[:movie_id]的值是单个元素数组。您正在使用该值作为哈希的键:

{params[:movie_id] => :id}

如果要指定:id的值为params[:movei_id]的密钥,那么您的哈希是向后的。你需要

{ id: params[:movie_id] }

答案 1 :(得分:0)

您可能正在访问API,但我仍然认为您的代码需要更好地构建:

#config/routes.rb
resources :movies

#app/controllers/movies_controller.rb
class MoviesController < ApplicationController
   def new
      @movie = Movie.new
      @movies = [[get data for Movies -- from API?]]
   end

   def create
      @movie = Movie.new movie_params
      @movie.save
   end

   private

   def movie_params
      params.require(:movie).permit(:id, :title, :rating, :release_date)
   end
end

然后你的表格如下:

#app/views/movies/new.html.erb
<%= form_for @movie do |f| %>
   <%= f.text_field :title %>
   <%= f.text_field :rating %>
   <%= f.collection_check_boxes :id, @movies, :id, :name %>
   <%= f.submit %>
<% end %>

目前,您的流程不是传统的;它没有正确构建和反对,也没有防范mass assignment

Rails / Ruby中的所有内容都是object orientated,这意味着当你&#34;创建&#34;新记录,您正在构建新的对象。可能听起来微不足道,但它是整个Rails框架的核心。

您对&#34的评论;如何继续添加电影的标题,评级和发布日期&#34; 表明不遵守该标题的后果。

简而言之,您需要newcreate个操作,这两个操作都引用了一个新的Movie对象,然后您可以使用从您的视图发送的参数填充该对象。

<强> API

如果您的流量取决于API回调,例如通过结算系统或其他方式,那么您应对上述内容做出的唯一例外就是。

如果您想保留当前的流量(IE来电add_tmdb),您需要确保填写{{1}的属性对象如下:

Movie