1

我正在 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.

我需要在哪里进行更改?

谢谢!

4

2 回答 2

2

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

{params[:movie_id] => :id}

如果你想指定一个:id值为 的键params[:movei_id],那么你的散列是向后的。你需要

{ id: params[:movie_id] }
于 2015-10-25T01:17:50.133 回答
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 %>

目前,您的流程不是常规的;它不能正确构建和对象,也不能防止大规模分配

Rails/Ruby 中的一切都是面向对象的,这意味着当您“创建”一条新记录时,您正在构建一个新对象。可能听起来微不足道,但它是整个 Rails 框架的核心。

您对“我如何继续添加电影的标题、评级和发行日期”的评论表明了不遵守它的后果。

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


API

您应该对上述内容做出的唯一例外是,如果您的流程依赖于API回调,例如通过计费系统或其他方式。

如果您想保留当前流程(IE 调用add_tmdb),您需要确保按如下方式填充对象的属性:Movie

#app/controllers/movies_controller.rb
class MoviesController < ApplicationController
   def add_tmdb
      @movie = Movie.new
      @movie.id = params[:movie_id]
      @movie.save

      #or....
      @movie = Movie.new({id: params[:movie_id]})
      @movie.save
   end
end
于 2015-10-25T10:25:22.850 回答