Rails Route, который обновляет или перенаправляет - PullRequest
0 голосов
/ 05 марта 2010

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

<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 ]

2 голосов
/ 05 марта 2010

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

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 голосов
/ 05 марта 2010

Попробуйте это в ваших маршрутах.rb:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...