2013-11-12 2 views
2

Я создал API для моего приложения Rails, и я использую BatmanJs для интерфейса. При создании нового элемента, Rails создать его, но бросить мне ошибку undefined method 'model_name' for TrueClass:Class ассоциировать с:Rails 4 сильных параметра custom require name

items_controller.rb

def create 
    @item = current_user.get_items.new(item_params) 
    respond_with @item.save # Apparently come from this line 
end 

Я считаю, что он пришел из моих настроек сильных параметров. Поскольку я использую пространство имен для этого API api/items, используя денщика, я также должен указать это в модели:

item.js.coffee

class App.Item extends Batman.Model 
    @resourceName: 'api/items' 
    @persist Batman.RailsStorage 

, а затем в мой контроллер я должен изменить сильные параметры в соответствии с этим, так как Бэтмен использует resourceName как индекс при отправке данных:

def item_params 
    params.require('api/item').permit(
    :name, :address, :postcode, :town, :phone, :email, :department_id, :country_id, :mobile, :fax, :website 
) 
end 

Я думаю, что моя ошибка исходит из того, что когда Rails попытаться создать экземпляр нового элемента, это пытался использовать api/item в качестве символа и не может найти ассоциированную модель. Поэтому мой вопрос заключается в том, как я могу изменить на лету params.require('api/item').permit до params.require(:item).permit перед тем, как создать новый элемент, чтобы Rails знал, что звонить?

Благодаря

EDIT
Вот что Бэтмен отправки Rails:

Started POST "/api/items.json" for 127.0.0.1 at 2013-11-13 11:20:29 +1100 
Processing by Api::V1::ItemsController#create as JSON 

Parameters: {"api/item"=>{"name"=>"Test item", "address"=>"12 street address", "fax"=>"", "phone"=>"09064521212", "mobile"=>"", "email"=>"[email protected]", "postcode"=>"64040", "town"=>"Los Angeles", "website"=>"www.test.com", "department_id"=>"2", "country_id"=>"2"}} 

и вот запрос он делает сразу после (в журнале сервера):

(0.5ms) BEGIN 
SQL (0.5ms) INSERT INTO `items` (`address`, `country_id`, `created_at`, `department_id`, `email`, `fax`, `group_id`, `mobile`, `name`, `phone`, `postcode`, `town`, `updated_at`, `website`) VALUES ('12 street address', 2, '2013-11-13 00:20:29', 2, '[email protected]', '', 1, '', 'Test item', '09064521212', '64040', 'Los Angeles', '2013-11-13 00:20:29', 'www.test.com') 
(52.7ms) COMMIT 

также ошибка в журнале сервера сразу после вставки:

NoMethodError - undefined method `model_name' for TrueClass:Class: 
    actionpack (4.0.0) lib/action_controller/model_naming.rb:9:in  `model_name_from_record_or_class' 
    actionpack (4.0.0) lib/action_dispatch/routing/polymorphic_routes.rb:182:in `build_named_route_call' 
    actionpack (4.0.0) lib/action_dispatch/routing/polymorphic_routes.rb:120:in `polymorphic_url' 
    actionpack (4.0.0) lib/action_dispatch/routing/url_for.rb:159:in `url_for' 
    actionpack (4.0.0) lib/action_controller/metal/rendering.rb:68:in `_process_options' 
    actionpack (4.0.0) lib/action_controller/metal/streaming.rb:202:in `_process_options' 
    actionpack (4.0.0) lib/action_controller/metal/renderers.rb:32:in `block in _handle_render_options' 
    actionpack (4.0.0) lib/action_controller/metal/renderers.rb:30:in `_handle_render_options' 
    actionpack (4.0.0) lib/action_controller/metal/renderers.rb:26:in `render_to_body' 
    actionpack (4.0.0) lib/abstract_controller/rendering.rb:97:in `render' 
    actionpack (4.0.0) lib/action_controller/metal/rendering.rb:16:in `render' 
    actionpack (4.0.0) lib/action_controller/metal/instrumentation.rb:41:in `block (2 levels) in render' 
+1

Я не знаком с Batmans, можете ли вы поместить фактический запрос, который делает BatmanJS. Так что будет немного понятнее работать. – nXqd

+0

Спасибо за ваш ответ. Я обновил свой пост – lkartono

+0

, это выглядит правильно для меня, вам, вероятно, нужно написать тест для этого случая и посмотреть, как это происходит. – nXqd

ответ

0

Хорошо, ребята, я наконец нашел, откуда эта проблема. Мне нужно заменить:

respond_with @item.save 

по:

respond_to do |format| 
    format.json { render json: @item.save } 
end 

Я до сих пор не понимаю, почему он не работает первый способ, как они должны быть одинаковыми. Если у кого-то есть объяснение, я буду более чем счастлив узнать об этом :)

Во всяком случае, теперь это исправлено. Спасибо всем за вашу помощь

0

Можете ли вы возиться с параметрами перед вызовом #require? Например:

def item_params 
    params[:item] = params["api/item"] if params[:item].blank? && params["item/api"].present? 
    item_attrs = [] # <-- your symbols here 
    params.require(:item).permit(*item_attrs) 
end 
+0

хорошо спасибо за ваш ответ, но он не работает. Это была довольно хорошая идея BTW, но я думаю, что проблема может возникнуть откуда-то еще :( – lkartono

Смежные вопросы