2012-04-24 2 views
1

Я разрабатываю небольшое приложение в Ruby-On-Rails. Я хочу вызвать метод контроллера из представления. Этот метод будет выполнять только некоторые вставки в таблицах базы данных. Каков правильный способ сделать это? Я пытался что-то вроде этого, но, видимо, код метода не выполняется:Как вызвать метод контроллера из представления?

<%= link_to 'Join', method: join_event %> 

ответ

5

Опция Способ вызова метода link_to на самом деле метод HTTP, а не имя действия. Это полезно при передаче опции HTTP Delete, так как маршрутизация RESTful использует метод DELETE для достижения действия destroy.

Что вам нужно сделать здесь, это настроить маршрут для вашего действия. Предполагая, что это называется join_event, добавьте следующие строки в routes.rb:

match '/join_event' => 'controllername#join_event', :as => 'join_event' 

Обязательно измените controllername на имя контроллера, который вы используете. Затем обновите свое представление следующим образом:

<%= link_to 'Join', join_event_path %> 

Метод _path создается на основе значения as в файле маршрутов.

Чтобы организовать код, вы можете инкапсулировать вставки в метод статической модели. Так что если у вас есть модель под названием MyModel с колонкой именем, вы могли бы сделать

class MyModel 
    # ... 
    def self.insert_examples 
    MyModel.create(:name => "test") 
    MyModel.create(:name => "test2") 
    MyModel.create(:name => "test3") 
    end 
end 

Тогда просто выполнить его в действие с помощью:

MyModel.insert_examples 
+0

Большое вам спасибо за ваш ответ. Это было очень полезно :) Как мне сделать, если я хочу, чтобы кнопка отображала форму и на основе полей формы выполняли вставки в базе данных? – notGeek

+0

Если вы хотите принять пользовательский ввод, это вопрос: a) настройка модели, b) запуск миграции базы данных для этой модели и c) настройка контроллера и просмотров для его поддержки. Я на самом деле предлагаю вам ознакомиться с руководством по началу работы: http://guides.rubyonrails.org/getting_started.html#getting-up-and-running-quickly-with-scaffolding, поскольку в нем излагаются некоторые из этих шагов. Если вы предпочитаете инвестировать в книгу, проверьте Rails 3 в действии – agmcleod

4

В дополнение к ответу agmcleod, вы можете выставить методы контроллера к просмотру с ActionController::Base::helper_method:

class EventsController < ApplicationController 
    helper_method :join_event 

    def join_event(event) 
    # ... 
    end 
end 

Но в этом случае, я думаю, Вам лучше всего после его советы и перенести этот метод на уровне модели, так как это инте racting с базой данных.

+0

Вы действительно не должны этого делать. Хотя вы можете более или менее идеально держать контроллер в курсе своих методов, и ничего больше :) – agmcleod

+2

@agmcleod Я не согласен. Метод контроллера «logged_in?», Который зависит от данных сеанса, чрезвычайно полезна в уровне представления. Как и в большинстве случаев, вам просто нужно знать, когда его использовать, и когда нужно злоупотреблять им :-) – Brandan

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