开发者

Rails Route that Updates or Redirects

Im not sure if I'm doing this right. I have an action that I would like to either copy, create, and save a new object if a user is logged in, or redirect if they are not logged in. Im not using a form here because I am using a stylized button with an image that looks like this:

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

and the action looks like this:

  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[:not开发者_StackOverflow中文版ice] = "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}

I have added this action as a :put in my routes and I'm not sure if this is right or if the other stuff is the right way to even do it for that matter. Any help is appreciated.


The specific answer to your question is

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

add action works on a member, not on a collection.

But there are other problems in your code. First, you should always use Rails helpers to generate the URLs. In fact, the path /lists/add/<%= @list.id %> is wrong. It should be /lists/<%= @list.id %>/add

Change

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

to

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

The controller can be simplified. Move the is_logged_in? check in a before filter.

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


Try this in your routes.rb:

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

:member - Same as :collection, but for actions that operate on a specific member.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜