2010-03-05 3 views
0

Я не уверен, что я делаю это правильно. У меня есть действие, которое я хотел бы скопировать, создать и сохранить новый объект, если пользователь вошел в систему, или перенаправить, если они не вошли в систему. Я не использую форму здесь, потому что я использую стилизованную кнопку с изображение, которое выглядит следующим образом:Маршрут Rails, который обновляет или перенаправляет

<a href="/lists/add/<%= @list.id %>" class="button"> 
    <span class="add_list">Learn these words</span> 
</a> 

и действие выглядит следующим образом:

def add  
    if is_logged_in? 
     list = logged_in_user.copy_list(params[:id]) 
     if list.save 
     flash[:notice] = "This list is now in your stash." 
     redirect_to stash_zoom_nav_quiz_path(list, "zoomout", "new", "quizoff") 
     else 
     flash[:notice] = "There was a problem adding this list." 
     redirect_to :back 
     end 
    else 
     redirect_to :controller => "users", :action => "signup_and_login", :list_id => params[:id]  
    end 
    end 

map.resources :lists, :collection => {:share => :get, :share_callback => :get, :add => :put} 

Я добавил эту акцию как: положить в моих маршрутах, и я не уверен, если это право или если другой материал - это правильный способ даже сделать это в этом отношении. Любая помощь приветствуется.

ответ

2

Конкретный ответ на ваш вопрос

map.resources :lists, :collection => { :share => :get, :share_callback => :get }, :member => { :add => :put } 

add действие работает на член, а не на коллекции.

Но есть и другие проблемы в коде. Во-первых, вы должны всегда использовать помощники Rails для создания URL-адресов. Фактически, путь /lists/add/<%= @list.id %> неверен. Он должен быть /lists/<%= @list.id %>/add

Изменить

<a href="/lists/add/<%= @list.id %>" class="button"> 
    <span class="add_list">Learn these words</span> 
</a> 

в

<% link_to add_list_path(@list), :class => "button" do %> 
    <span class="add_list">Learn these words</span> 
<% end %> 

Контроллер может быть упрощена. Переместите отметку is_logged_in? перед фильтром.

class MyController < ActionController::Base 

    before_filter :require_logged_user, :only => %w(add) 

    def add  
    list = logged_in_user.copy_list(params[:id]) 
    if list.save 
     flash[:notice] = "This list is now in your stash." 
     redirect_to stash_zoom_nav_quiz_path(list, "zoomout", "new", "quizoff") 
    else 
     flash[:notice] = "There was a problem adding this list." 
     redirect_to :back 
    end 
    end 

    protected 

    def require_logged_user 
    if !is_logged_in? 
     redirect_to :controller => "users", :action => "signup_and_login", :list_id => params[:id] 
    end 
    end 

end 
+0

Просто из-за любопытства, что было бы отрицательным побочным эффектом неправильной маркировки членов как коллекций? – TenJack

+0

Также спасибо за помощь, я не знал, что вы можете создать блок с link_to! – TenJack

+0

Одна вещь, я думал, что должен использовать метод POST здесь. B/c. Я создаю новую запись, однако, если я использую POST или PUT, я получаю ошибку маршрутизации «ActionController :: UnknownAction». Кажется, GET - единственный метод, что слова, это хорошо? – TenJack

0

Попробуйте это в routes.rb:

map.resources :lists, :member => {:add => :put}, :collection => {:share => :get, :share_callback => :get} 

: член - То же, что: коллекции, но и для действий, которые работают на конкретный члене.

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