Rendering different views in one action

2019-02-02 03:49发布

I want to have 2 kinds of views for the same posts in my rails application. For instance - in one where a logged in user can update and edit the post, and in the other any user can just view it and comment on it or select it.

How should I go about this? Do I need a separate class? I know I need a separate view for each, but how about the model and the controller?

1条回答
beautiful°
2楼-- · 2019-02-02 04:16

1.case: your views are going to have similar content, but only the signed in users will have extra options like editing.

You should use a partial view and in your main view you should write something like this:

<% if signed_in? %>
    <%= render 'edit_form' %>
<% end %>

Remember, the name of the partial should always start with a underscore, so your partial in this case would be called _edit_form.html.erb or _edit_form.html.haml, depending on what you are using.

2.case: depending on if the user is signed in or not, you want to render completely different views, then you should handle it in your controller:

def show
  if signed_in?
    render 'show_with_edit'
  else
    render 'show_without_edit`
  end
end

And your files would be named show_with_edit.html.erb and show_without_edit.html.erb

Also, if your view for a signed in user was called show then you could just do this:

def show
  render 'show_without_edit' unless signed_in?
end

3.case: if you want to change basically EVERYTHING depending if the user is signed in or not, you could create some custom methods and call them inside your original action like this:

def show 
  if singed_in? 
    show_signed_in
  else
    show_not_signed_in
  end
end

private

def show_signed_in
   # declaring some instance variables to use in the view..
   render 'some_view'
end

def show_not_signed_in
   # declaring some other instance variables to use in the view..
   render 'some_other_view'
end
查看更多
登录 后发表回答