Rails - 如何向未登录的用户显示“添加收藏夹”按钮?

时间:2013-04-30 19:54:06

标签: ruby-on-rails-3

我想向未登录的用户显示“添加到收藏夹”按钮,以便他们可以看到已登录的用户可以将帖子(在这种情况下)添加到他们的收藏夹中。

这是当前的代码:

的routes.rb

resources :users do
  resources :favourites
end
resources :favourites, only: [:create, :destroy]

posts_helper.rb(一旦我开始工作,我会移动此application_helper)

PostsHelper
  def new_favourite
    if signed_in?
      return current_user.favourites.build
    else
      return Favourite.new
    end
  end
end

show.html.erb

<%= render :partial => 'shared/favourites/favourite_form', :locals => { :object => @post } %>

_favourite_form.html.erb

<% if signed_in? && current_user.favourited?(object) %>
  <%= render partial: 'shared/favourites/unfavourite', locals: { object: object } %>
<% else %>
  <%= render partial: 'shared/favourites/favourite', locals: { object: object } %>
<% end %>

_favourite.html.erb

<%= form_for(new_favourite, remote: signed_in?) do |f| %>
    <div>
        <%= f.hidden_field :object_id, :value => object.id %>
        <%= f.hidden_field :object_type, :value => object.class.name.demodulize %>
    </div>
    <%= button_tag(:type => 'submit', :id => 'add_favourite') do %>
       Add to Favourites
    <% end %>
<% end %>

我希望它不进行ajax调用(即使用页面重新加载提交添加收藏表单)如果用户未登录以便它将看到用户正在尝试访问受保护的页面,则会将其重定向到登录并成功[当它将它们重定向回原来试图去的地方时]它将添加收藏夹。

有人可以告知我需要做些什么才能实现这一目标。


编辑:

更新代码以反映当前状态。

登录后,重定向回No route matches [GET] "/favourites",因为favouritesusers下的嵌套资源。


编辑2:

重定向的工作原理与Rails Tutorial中的相同:

将用户重定向到登录页面(signed_in_user): http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-correct_user_before_filter

存储位置以将用户重定向回: http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-friendly_forwarding_code http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-friendly_session_create

唯一的区别是,在我的登录页面上,我使用facebook omniauth链接供用户登录,但登录后的重定向仍然按预期工作。

1 个答案:

答案 0 :(得分:0)

使用辅助方法代替current_user.favourites.build

<%= form_for(new_favourite, remote: true) do |f| %>

助手:

PostsHelper
  def new_favourite
    if signed_in?
      return current_user.favourites.build
    else
      return Favourite.new
    end
  end
end